├── LICENSE ├── README.md ├── ZSSnapshotKit.podspec ├── ZSSnapshotKit ├── SnapshotKitProtocol.h ├── UIScrollView+Snapshot.h ├── UIScrollView+Snapshot.m ├── UITableView+Snapshot.h ├── UITableView+Snapshot.m ├── UIView+Snapshot.h ├── UIView+Snapshot.m ├── UIWebView+Snapshot.h ├── UIWebView+Snapshot.m ├── UIWindow+Snapshot.h ├── UIWindow+Snapshot.m ├── WKWebView+Snapshot.h ├── WKWebView+Snapshot.m ├── WebViewPrintPageRenderer.h └── WebViewPrintPageRenderer.m └── ZSSnapshotKit_master ├── ZSSnapshotKit_master.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata │ │ └── safiri.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── xcuserdata │ └── safiri.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ └── xcschememanagement.plist └── ZSSnapshotKit_master ├── AppDelegate.h ├── AppDelegate.m ├── Assets.xcassets ├── AppIcon.appiconset │ └── Contents.json └── Contents.json ├── Base.lproj ├── LaunchScreen.storyboard └── Main.storyboard ├── Info.plist ├── SVProgressHUD ├── LICENSE ├── README.md └── SVProgressHUD │ ├── SVIndefiniteAnimatedView.h │ ├── SVIndefiniteAnimatedView.m │ ├── SVProgressAnimatedView.h │ ├── SVProgressAnimatedView.m │ ├── SVProgressHUD.bundle │ ├── angle-mask.png │ ├── angle-mask@2x.png │ ├── angle-mask@3x.png │ ├── error.png │ ├── error@2x.png │ ├── error@3x.png │ ├── info.png │ ├── info@2x.png │ ├── info@3x.png │ ├── success.png │ ├── success@2x.png │ └── success@3x.png │ ├── SVProgressHUD.h │ ├── SVProgressHUD.m │ ├── SVRadialGradientLayer.h │ └── SVRadialGradientLayer.m ├── Source └── html │ ├── aui.css │ ├── dibupic.png │ ├── echarts.min.js │ ├── jQuery-v3.1.1.js │ ├── jaizaizhong.html │ ├── jquery.circliful.js │ ├── linghongbaobanner.png │ ├── mobiscroll.custom-2.17.0.min-zh.js │ ├── qiehuan-icon.png │ ├── qiehuancheliang.html │ ├── weizhangdidian.png │ ├── weizhangfenxi.html │ ├── wzfxstyle.css │ ├── wzxwfx-banner.png │ ├── wzxwfx-can.png │ ├── wzxwfx-che.png │ ├── wzxwfx-jieguo.png │ ├── wzxwfx-lu.png │ ├── wzxwfx-luan.png │ ├── wzxwfx-lz.png │ ├── wzxwfx-mi.png │ ├── wzxwfx-shuai.png │ ├── wzxwfx-sid.png │ ├── wzxwfx-sid2.png │ ├── wzxwfx-wen.png │ └── zhuanquanquna.gif ├── ViewController.h ├── ViewController.m ├── WebViewTester ├── WKWebViewTesterViewController.h └── WKWebViewTesterViewController.m └── main.m /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 safiriGitHub 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ZSCircleChartView 2 | 3 | ### 项目介绍 4 | 5 | iOS截图长截图功能kit 6 | 7 | 安装使用 `pod 'ZSSnapshotKit', '~> 0.0.2'` 8 | 9 | 10 | ### 简单介绍 11 | 12 | - 0.0.1 13 | 14 | **`SnapshotKitProtocol`:** 统一提供截图功能协议方法 15 | 16 | **`WKWebView+Snapshot`:** WKWebView 截图功能实现 17 | 18 | **`WebViewPrintPageRenderer`:** WebView -> PDF 打印 19 | 20 | - 0.0.2: 21 | 22 | **`UIWebView+Snapshot`:** UIWebView 截图功能实现 23 | 24 | **`UIScrollView+Snapshot`:** UIScrollView 截图功能实现 25 | 26 | **`UITableView+Snapshot`:** UITableView 截图功能实现 27 | 28 | **`UIView+Snapshot`:** UIView 截图功能实现 29 | 30 | **`UIWindow+Snapshot`:** UIWindow 截图功能实现 31 | 32 | 33 | ### 版本记录 34 | 35 | **0.0.1:** 36 | 37 | 实现 WKWebView 相关截图功能,TODO:暂未实现截图拼接功能 38 | 39 | **0.0.2:** 40 | 41 | WKWebView 实现截图拼接功能; 42 | 43 | UIWebView、UIScrollView、UITableView、UIView、UIWindow 实现相关协议截图功能 44 | 45 | #### 效果 46 | 47 | 请运行Demo查看 48 | 49 | -------------------------------------------------------------------------------- /ZSSnapshotKit.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod spec lint ZSCircleChartView.podspec' to ensure this is a 3 | # valid spec and to remove all comments including this before submitting the spec. 4 | # 5 | # To learn more about Podspec attributes see http://docs.cocoapods.org/specification.html 6 | # To see working Podspecs in the CocoaPods repo see https://github.com/CocoaPods/Specs/ 7 | # 8 | 9 | Pod::Spec.new do |s| 10 | 11 | # ――― Spec Metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 12 | # 13 | # These will help people to find your library, and whilst it 14 | # can feel like a chore to fill in it's definitely to your advantage. The 15 | # summary should be tweet-length, and the description more in depth. 16 | # 17 | 18 | s.name = "ZSSnapshotKit" 19 | s.version = "0.0.2" 20 | s.summary = "iOS截图长截图功能kit" 21 | 22 | # This description is used to generate tags and improve search results. 23 | # * Think: What does it do? Why did you write it? What is the focus? 24 | # * Try to keep it short, snappy and to the point. 25 | # * Write the description between the DESC delimiters below. 26 | # * Finally, don't worry about the indent, CocoaPods strips it! 27 | s.description = <<-DESC 28 | iOS截图长截图功能kit。WKWebView、UIWebView 29 | DESC 30 | 31 | s.homepage = "https://github.com/safiriGitHub/ZSSnapshotKit" 32 | # s.screenshots = "www.example.com/screenshots_1.gif", "www.example.com/screenshots_2.gif" 33 | 34 | 35 | # ――― Spec License ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 36 | # 37 | # Licensing your code is important. See http://choosealicense.com for more info. 38 | # CocoaPods will detect a license file if there is a named LICENSE* 39 | # Popular ones are 'MIT', 'BSD' and 'Apache License, Version 2.0'. 40 | # 41 | 42 | # s.license = "MIT (example)" 43 | s.license = { :type => "MIT", :file => "LICENSE" } 44 | 45 | 46 | # ――― Author Metadata ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 47 | # 48 | # Specify the authors of the library, with email addresses. Email addresses 49 | # of the authors are extracted from the SCM log. E.g. $ git log. CocoaPods also 50 | # accepts just a name if you'd rather not provide an email address. 51 | # 52 | # Specify a social_media_url where others can refer to, for example a twitter 53 | # profile URL. 54 | # 55 | 56 | s.author = { "safiri" => "safiri@163.com" } 57 | # Or just: s.author = "safiri" 58 | # s.authors = { "safiri" => "safiri@163.com" } 59 | # s.social_media_url = "http://twitter.com/safiri" 60 | 61 | # ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 62 | # 63 | # If this Pod runs only on iOS or OS X, then specify the platform and 64 | # the deployment target. You can optionally include the target after the platform. 65 | # 66 | 67 | # s.platform = :ios 68 | s.platform = :ios, "8.0" 69 | 70 | # When using multiple platforms 71 | # s.ios.deployment_target = "5.0" 72 | # s.osx.deployment_target = "10.7" 73 | # s.watchos.deployment_target = "2.0" 74 | # s.tvos.deployment_target = "9.0" 75 | 76 | 77 | # ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 78 | # 79 | # Specify the location from where the source should be retrieved. 80 | # Supports git, hg, bzr, svn and HTTP. 81 | # 82 | 83 | s.source = { :git => "https://github.com/safiriGitHub/ZSSnapshotKit.git", :tag => "#{s.version}" } 84 | 85 | 86 | # ――― Source Code ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 87 | # 88 | # CocoaPods is smart about how it includes source code. For source files 89 | # giving a folder will include any swift, h, m, mm, c & cpp files. 90 | # For header files it will include any header in the folder. 91 | # Not including the public_header_files will make all headers public. 92 | # 93 | 94 | s.source_files = "ZSSnapshotKit", "ZSSnapshotKit/**/*.{h,m}" 95 | # s.exclude_files = "Classes/Exclude" 96 | 97 | # s.public_header_files = "Classes/**/*.h" 98 | 99 | 100 | # ――― Resources ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 101 | # 102 | # A list of resources included with the Pod. These are copied into the 103 | # target bundle with a build phase script. Anything else will be cleaned. 104 | # You can preserve files from being cleaned, please don't preserve 105 | # non-essential files like tests, examples and documentation. 106 | # 107 | 108 | # s.resource = "icon.png" 109 | # s.resources = "Resources/*.png" 110 | 111 | # s.preserve_paths = "FilesToSave", "MoreFilesToSave" 112 | 113 | 114 | # ――― Project Linking ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 115 | # 116 | # Link your library with frameworks, or libraries. Libraries do not include 117 | # the lib prefix of their name. 118 | # 119 | 120 | # s.framework = "SomeFramework" 121 | # s.frameworks = "SomeFramework", "AnotherFramework" 122 | 123 | # s.library = "iconv" 124 | # s.libraries = "iconv", "xml2" 125 | 126 | 127 | # ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 128 | # 129 | # If your library depends on compiler flags you can set them in the xcconfig hash 130 | # where they will only apply to your library. If you depend on other Podspecs 131 | # you can include multiple dependencies to ensure it works. 132 | 133 | # s.requires_arc = true 134 | 135 | # s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" } 136 | # s.dependency "JSONKit", "~> 1.4" 137 | 138 | end 139 | -------------------------------------------------------------------------------- /ZSSnapshotKit/SnapshotKitProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SnapshotKitProtocol.h 3 | // ZSSnapshotKit_master 4 | // 5 | // Created by safiri on 2019/5/21. 6 | // Copyright © 2019 safiri. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #ifndef SnapshotKitProtocol_h 12 | #define SnapshotKitProtocol_h 13 | 14 | @protocol SnapshotKitProtocol 15 | 16 | @optional 17 | 18 | /** 19 | 同步获取视图可见内容的快照 20 | 21 | @return UIImage 22 | */ 23 | - (UIImage * _Nullable)takeSnapshotOfVisibleContent; 24 | 25 | /** 26 | 同步获取视图全部内容的快照 27 | 重要提示:当视图的全部内容的大小很小时,使用此方法进行快照 28 | @return UIImage 29 | */ 30 | - (UIImage * _Nullable)takeSnapshotOfFullContent; 31 | 32 | /** 33 | 异步获取视图全部内容的快照 34 | 重要提示:当视图的全部内容很大时,使用此方法进行快照 35 | @param completion 异步结果回调 36 | */ 37 | - (void)asyncTakeSnapshotOfFullContent:(void(^_Nullable)(UIImage *_Nullable image))completion; 38 | 39 | @end 40 | 41 | #endif /* SnapshotKitProtocol_h */ 42 | -------------------------------------------------------------------------------- /ZSSnapshotKit/UIScrollView+Snapshot.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIScrollView+Snapshot.h 3 | // ZSSnapshotKit_master 4 | // 5 | // Created by safiri on 2019/5/22. 6 | // Copyright © 2019 safiri. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SnapshotKitProtocol.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface UIScrollView (Snapshot) 15 | 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | -------------------------------------------------------------------------------- /ZSSnapshotKit/UIScrollView+Snapshot.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIScrollView+Snapshot.m 3 | // ZSSnapshotKit_master 4 | // 5 | // Created by safiri on 2019/5/22. 6 | // Copyright © 2019 safiri. All rights reserved. 7 | // 8 | 9 | #import "UIScrollView+Snapshot.h" 10 | #import "UIView+Snapshot.h" 11 | 12 | @implementation UIScrollView (Snapshot) 13 | 14 | - (UIImage *)takeSnapshotOfVisibleContent { 15 | CGRect visibleRect = self.bounds; 16 | visibleRect.origin = self.contentOffset; 17 | return [self takeSnapshotOfFullContentForCroppingRect:visibleRect]; 18 | } 19 | 20 | - (UIImage *)takeSnapshotOfFullContent { 21 | CGRect originalFrame = self.frame; 22 | CGPoint originalOffset = self.contentOffset; 23 | 24 | self.frame = CGRectMake(originalFrame.origin.x, originalFrame.origin.y, self.contentSize.width, self.contentSize.height); 25 | self.contentOffset = CGPointZero; 26 | 27 | UIColor *backgroundColor = self.backgroundColor; 28 | if (backgroundColor == nil) backgroundColor = UIColor.whiteColor; 29 | 30 | UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, 0); 31 | 32 | CGContextRef context = UIGraphicsGetCurrentContext(); 33 | if (context == nil) return nil; 34 | CGContextSetFillColorWithColor(context, backgroundColor.CGColor); 35 | CGContextSetStrokeColorWithColor(context, backgroundColor.CGColor); 36 | 37 | [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES]; 38 | UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 39 | UIGraphicsEndImageContext(); 40 | 41 | self.frame = originalFrame; 42 | self.contentOffset = originalOffset; 43 | 44 | return image; 45 | } 46 | 47 | - (void)asyncTakeSnapshotOfFullContent:(void (^)(UIImage * _Nullable))completion { 48 | 49 | //在截图之前先将用户看到的当前页面截取下来,作为一张图片挡住接下来所执行的截取操作, 50 | //并且在执行完截图操作后,将截取的遮盖图片销毁。 51 | UIImageView *coverImageView = [[UIImageView alloc] initWithFrame:self.frame]; 52 | coverImageView.image = [self takeSnapshotOfVisibleContent]; 53 | coverImageView.backgroundColor = [UIColor redColor]; 54 | [self.superview addSubview:coverImageView]; 55 | [self.superview bringSubviewToFront:coverImageView]; 56 | 57 | //分页绘制内容到ImageContext 58 | CGPoint originalOffset = self.contentOffset; 59 | 60 | // 当contentSize.height self.bounds.size.height) { 63 | pageNum = (NSInteger)floorf(self.contentSize.height / self.bounds.size.height); 64 | } 65 | 66 | UIColor *backgroundColor = self.backgroundColor; 67 | if (backgroundColor == nil) backgroundColor = UIColor.whiteColor; 68 | 69 | UIGraphicsBeginImageContextWithOptions(self.contentSize, YES, 0); 70 | CGContextRef context = UIGraphicsGetCurrentContext(); 71 | if (context == nil) { 72 | [coverImageView removeFromSuperview]; 73 | completion(nil); 74 | return; 75 | } 76 | 77 | CGContextSetFillColorWithColor(context, backgroundColor.CGColor); 78 | CGContextSetStrokeColorWithColor(context, backgroundColor.CGColor); 79 | 80 | [self drawScreenshotOfPageContent:0 maxIndex:pageNum completion:^{ 81 | UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 82 | UIGraphicsEndImageContext(); 83 | self.contentOffset = originalOffset; 84 | [coverImageView removeFromSuperview]; 85 | if (completion) { 86 | completion(image); 87 | } 88 | }]; 89 | } 90 | 91 | - (void)drawScreenshotOfPageContent:(NSInteger)index maxIndex:(NSInteger)maxIndex completion:(void(^)(void))completion { 92 | 93 | [self setContentOffset:CGPointMake(0, index * self.frame.size.height)]; 94 | CGRect pageFrame = CGRectMake(0, index * self.frame.size.height, self.bounds.size.width, self.bounds.size.height); 95 | 96 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 97 | [self drawViewHierarchyInRect:pageFrame afterScreenUpdates:YES]; 98 | if (index < maxIndex) { 99 | [self drawScreenshotOfPageContent:index+1 maxIndex:maxIndex completion:completion]; 100 | }else { 101 | if (completion) { 102 | completion(); 103 | } 104 | } 105 | }); 106 | 107 | } 108 | 109 | @end 110 | -------------------------------------------------------------------------------- /ZSSnapshotKit/UITableView+Snapshot.h: -------------------------------------------------------------------------------- 1 | // 2 | // UITableView+Snapshot.h 3 | // ZSSnapshotKit_master 4 | // 5 | // Created by safiri on 2019/5/22. 6 | // Copyright © 2019 safiri. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SnapshotKitProtocol.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface UITableView (Snapshot) 15 | 16 | - (UIImage * _Nullable)takeSnapshotOfTableHeaderView; 17 | 18 | - (UIImage * _Nullable)takeSnapshotOfTableFooterView; 19 | 20 | - (UIImage * _Nullable)takeSnapshotOfSectionHeaderView:(NSInteger)section; 21 | 22 | - (UIImage * _Nullable)takeSnapshotOfSectionFooterView:(NSInteger)section; 23 | 24 | - (UIImage * _Nullable)takeSnapshotOfCell:(NSIndexPath *)indexPath; 25 | 26 | @end 27 | 28 | NS_ASSUME_NONNULL_END 29 | -------------------------------------------------------------------------------- /ZSSnapshotKit/UITableView+Snapshot.m: -------------------------------------------------------------------------------- 1 | // 2 | // UITableView+Snapshot.m 3 | // ZSSnapshotKit_master 4 | // 5 | // Created by safiri on 2019/5/22. 6 | // Copyright © 2019 safiri. All rights reserved. 7 | // 8 | 9 | #import "UITableView+Snapshot.h" 10 | #import "UIView+Snapshot.h" 11 | 12 | @implementation UITableView (Snapshot) 13 | 14 | - (UIImage *)takeSnapshotOfTableHeaderView { 15 | CGRect rect = self.tableHeaderView.frame; 16 | if (rect.size.width > 0 & rect.size.height > 0) { 17 | [self scrollRectToVisible:rect animated:NO]; 18 | UIImage *image = [self takeSnapshotOfFullContentForCroppingRect:rect]; 19 | return image; 20 | } 21 | return nil; 22 | } 23 | 24 | - (UIImage *)takeSnapshotOfTableFooterView { 25 | CGRect rect = self.tableFooterView.frame; 26 | if (rect.size.width > 0 & rect.size.height > 0) { 27 | [self scrollRectToVisible:rect animated:NO]; 28 | UIImage *image = [self takeSnapshotOfFullContentForCroppingRect:rect]; 29 | return image; 30 | } 31 | return nil; 32 | } 33 | 34 | - (UIImage *)takeSnapshotOfSectionHeaderView:(NSInteger)section { 35 | CGRect rect = [self rectForHeaderInSection:section]; 36 | if (rect.size.width > 0 && rect.size.height > 0) { 37 | [self scrollRectToVisible:rect animated:NO]; 38 | UIImage *image = [self takeSnapshotOfFullContentForCroppingRect:rect]; 39 | return image; 40 | } 41 | return nil; 42 | } 43 | 44 | - (UIImage *)takeSnapshotOfSectionFooterView:(NSInteger)section { 45 | CGRect rect = [self rectForFooterInSection:section]; 46 | if (rect.size.width > 0 && rect.size.height > 0) { 47 | [self scrollRectToVisible:rect animated:NO]; 48 | UIImage *image = [self takeSnapshotOfFullContentForCroppingRect:rect]; 49 | return image; 50 | } 51 | return nil; 52 | } 53 | 54 | - (UIImage *)takeSnapshotOfCell:(NSIndexPath *)indexPath { 55 | if ([self.indexPathsForVisibleRows containsObject:indexPath] == NO) { 56 | [self scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO]; 57 | } 58 | UIImage *image = [[self cellForRowAtIndexPath:indexPath] takeSnapshotOfFullContent]; 59 | return image; 60 | } 61 | 62 | - (UIImage *)internalTakeSnapshotOfFullContent { 63 | NSMutableArray *shotImages = [NSMutableArray array]; 64 | 65 | UIImage *imageh = [self takeSnapshotOfTableHeaderView]; 66 | if (imageh) { 67 | [shotImages addObject:imageh]; 68 | } 69 | 70 | for (NSInteger section = 0; section < self.numberOfSections; section++) { 71 | UIImage *imageh = [self takeSnapshotOfSectionHeaderView:section]; 72 | if (imageh) { 73 | [shotImages addObject:imageh]; 74 | } 75 | 76 | NSInteger rows = [self numberOfRowsInSection:section]; 77 | for (NSInteger row = 0; row < rows; row++) { 78 | NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section]; 79 | UIImage *imagec = [self takeSnapshotOfCell:indexPath]; 80 | if (imagec) { 81 | [shotImages addObject:imagec]; 82 | } 83 | } 84 | 85 | UIImage *imagef = [self takeSnapshotOfSectionFooterView:section]; 86 | if (imagef) { 87 | [shotImages addObject:imagef]; 88 | } 89 | } 90 | 91 | UIImage *imagef = [self takeSnapshotOfTableFooterView]; 92 | if (imagef) { 93 | [shotImages addObject:imagef]; 94 | } 95 | 96 | if (shotImages.count == 0) { 97 | return nil; 98 | } 99 | 100 | // 合成图片:计算总大小,然后拼接图片 101 | CGSize totalSize = CGSizeMake(self.bounds.size.width, 0); 102 | for (UIImage *image in shotImages) { 103 | totalSize.height += image.size.height; 104 | } 105 | 106 | UIColor *backgroundColor = self.backgroundColor; 107 | if (backgroundColor == nil) backgroundColor = UIColor.whiteColor; 108 | UIImage *resultImage = nil; 109 | 110 | UIGraphicsBeginImageContextWithOptions(totalSize, YES, 0); 111 | CGContextRef context = UIGraphicsGetCurrentContext(); 112 | if (context == nil) return nil; 113 | 114 | CGContextSetFillColorWithColor(context, backgroundColor.CGColor); 115 | CGContextSetStrokeColorWithColor(context, backgroundColor.CGColor); 116 | CGFloat imageOffsetFactor = 0; 117 | for (UIImage *image in shotImages) { 118 | [image drawAtPoint:CGPointMake(0, imageOffsetFactor)]; 119 | imageOffsetFactor += image.size.height; 120 | } 121 | resultImage = UIGraphicsGetImageFromCurrentImageContext(); 122 | UIGraphicsEndImageContext(); 123 | 124 | return resultImage; 125 | } 126 | 127 | - (UIImage *)takeSnapshotOfVisibleContent { 128 | CGRect visibleRect = self.bounds; 129 | visibleRect.origin = self.contentOffset; 130 | 131 | return [self takeSnapshotOfFullContentForCroppingRect:visibleRect]; 132 | } 133 | 134 | - (UIImage *)takeSnapshotOfFullContent { 135 | CGPoint originalOffset = self.contentOffset; 136 | UIImage *image = [self internalTakeSnapshotOfFullContent]; 137 | [self setContentOffset:originalOffset animated:NO]; 138 | return image; 139 | } 140 | 141 | - (void)asyncTakeSnapshotOfFullContent:(void (^)(UIImage * _Nullable))completion { 142 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 143 | UIImage *image = [self takeSnapshotOfFullContent]; 144 | if (completion) { 145 | completion(image); 146 | } 147 | }); 148 | } 149 | @end 150 | -------------------------------------------------------------------------------- /ZSSnapshotKit/UIView+Snapshot.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+Snapshot.h 3 | // ZSSnapshotKit_master 4 | // 5 | // Created by safiri on 2019/5/22. 6 | // Copyright © 2019 safiri. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SnapshotKitProtocol.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface UIView (Snapshot) 15 | 16 | /** 17 | 对指定区域截图 18 | 19 | @param croppingRect 指定裁剪Rect 20 | @return 图片 21 | */ 22 | - (UIImage *)takeSnapshotOfFullContentForCroppingRect:(CGRect)croppingRect; 23 | 24 | @end 25 | 26 | NS_ASSUME_NONNULL_END 27 | -------------------------------------------------------------------------------- /ZSSnapshotKit/UIView+Snapshot.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+Snapshot.m 3 | // ZSSnapshotKit_master 4 | // 5 | // Created by safiri on 2019/5/22. 6 | // Copyright © 2019 safiri. All rights reserved. 7 | // 8 | 9 | #import "UIView+Snapshot.h" 10 | 11 | @implementation UIView (Snapshot) 12 | 13 | - (UIImage *)takeSnapshotOfVisibleContent { 14 | return [self takeSnapshotOfFullContentForCroppingRect:self.bounds]; 15 | } 16 | 17 | - (UIImage *)takeSnapshotOfFullContent { 18 | return [self takeSnapshotOfFullContentForCroppingRect:self.bounds]; 19 | } 20 | 21 | - (void)asyncTakeSnapshotOfFullContent:(void (^)(UIImage * _Nullable))completion { 22 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 23 | UIImage *image = [self takeSnapshotOfFullContent]; 24 | if (completion) { 25 | completion(image); 26 | } 27 | }); 28 | } 29 | - (UIImage *)takeSnapshotOfFullContentForCroppingRect:(CGRect)croppingRect { 30 | // floor(x): 如果参数是小数,则求最大的整数但不大于本身,如floor(3.001)=3.0 31 | // 由于 croppingView(要裁剪的子视图)的实际size,可能比获取到的size小 32 | //(double精度问题导致这种差异),所以使用floor对获取到的size进行一次处理, 33 | // 使获取到的size不大于实际的size,以避免生成的图片底部会出现1px左右的黑线 34 | UIColor *backgroundColor = self.backgroundColor; 35 | if (backgroundColor == nil) backgroundColor = UIColor.whiteColor; 36 | // 若View为非透明且无圆角,则创建非透明的画布 37 | // 非透明的画布渲染速度比透明的画布要快 38 | BOOL opaqueCanvas = self.isOpaque && self.layer.cornerRadius == 0; 39 | // 对于透明的画布,使用白色作为底色 40 | if (opaqueCanvas == NO) backgroundColor = UIColor.whiteColor; 41 | 42 | CGSize contentSize = CGSizeMake(floor(croppingRect.size.width), floor(croppingRect.size.height)); 43 | UIGraphicsBeginImageContextWithOptions(contentSize, opaqueCanvas, 0); 44 | CGContextRef context = UIGraphicsGetCurrentContext(); 45 | if (context == nil) return nil; 46 | CGContextSaveGState(context); 47 | CGContextClearRect(context, croppingRect); 48 | CGContextSetFillColorWithColor(context, backgroundColor.CGColor); 49 | CGContextFillRect(context, croppingRect); 50 | CGContextTranslateCTM(context, -croppingRect.origin.x, -croppingRect.origin.y); 51 | [self.layer renderInContext:context]; 52 | CGContextRestoreGState(context); 53 | 54 | UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 55 | UIGraphicsEndImageContext(); 56 | return image; 57 | } 58 | 59 | @end 60 | -------------------------------------------------------------------------------- /ZSSnapshotKit/UIWebView+Snapshot.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIWebView+Snapshot.h 3 | // ZSSnapshotKit_master 4 | // 5 | // Created by safiri on 2019/5/22. 6 | // Copyright © 2019 safiri. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SnapshotKitProtocol.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface UIWebView (Snapshot) 15 | 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | -------------------------------------------------------------------------------- /ZSSnapshotKit/UIWebView+Snapshot.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIWebView+Snapshot.m 3 | // ZSSnapshotKit_master 4 | // 5 | // Created by safiri on 2019/5/22. 6 | // Copyright © 2019 safiri. All rights reserved. 7 | // 8 | 9 | #import "UIWebView+Snapshot.h" 10 | #import "UIScrollView+Snapshot.h" 11 | #import "WebViewPrintPageRenderer.h" 12 | 13 | @implementation UIWebView (Snapshot) 14 | 15 | - (UIImage *)takeSnapshotOfVisibleContent { 16 | return [self.scrollView takeSnapshotOfVisibleContent]; 17 | } 18 | 19 | - (UIImage *)takeSnapshotOfFullContent { 20 | return [self.scrollView takeSnapshotOfFullContent]; 21 | } 22 | 23 | - (void)asyncTakeSnapshotOfFullContent:(void (^)(UIImage * _Nullable))completion { 24 | 25 | UIImageView *coverImageView = [[UIImageView alloc] initWithFrame:self.bounds]; 26 | coverImageView.image = [self takeSnapshotOfVisibleContent]; 27 | [self addSubview:coverImageView]; 28 | [self bringSubviewToFront:coverImageView]; 29 | 30 | CGPoint originalOffset = self.scrollView.contentOffset; 31 | 32 | // 当contentSize.height self.scrollView.bounds.size.height) { 35 | pageNum = (NSInteger)floorf(self.scrollView.contentSize.height / self.scrollView.bounds.size.height); 36 | } 37 | 38 | [self loadPageContentIndex:0 maxIndex:pageNum completion:^{ 39 | self.scrollView.contentOffset = CGPointZero; 40 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 41 | WebViewPrintPageRenderer *render = [[WebViewPrintPageRenderer alloc] initFormatter:self.viewPrintFormatter contentSize:self.scrollView.contentSize]; 42 | UIImage *image = [render printContentToImage]; 43 | self.scrollView.contentOffset = originalOffset; 44 | [coverImageView removeFromSuperview]; 45 | if (completion) completion(image); 46 | }); 47 | }]; 48 | } 49 | 50 | - (void)loadPageContentIndex:(NSInteger)index maxIndex:(NSInteger)maxIndex completion:(void(^)(void))completion { 51 | 52 | [self.scrollView setContentOffset:CGPointMake(0, index * self.scrollView.frame.size.height)]; 53 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 54 | if (index < maxIndex) { 55 | [self loadPageContentIndex:index + 1 maxIndex:maxIndex completion:completion]; 56 | }else { 57 | if (completion) completion(); 58 | } 59 | 60 | }); 61 | } 62 | 63 | @end 64 | -------------------------------------------------------------------------------- /ZSSnapshotKit/UIWindow+Snapshot.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIWindow+Snapshot.h 3 | // ZSSnapshotKit_master 4 | // 5 | // Created by safiri on 2019/5/22. 6 | // Copyright © 2019 safiri. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SnapshotKitProtocol.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface UIWindow (Snapshot) 15 | 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | -------------------------------------------------------------------------------- /ZSSnapshotKit/UIWindow+Snapshot.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIWindow+Snapshot.m 3 | // ZSSnapshotKit_master 4 | // 5 | // Created by safiri on 2019/5/22. 6 | // Copyright © 2019 safiri. All rights reserved. 7 | // 8 | 9 | #import "UIWindow+Snapshot.h" 10 | 11 | @implementation UIWindow (Snapshot) 12 | 13 | - (UIImage *)takeSnapshotOfVisibleContent { 14 | return [self takeSnapshotOfFullContent]; 15 | } 16 | 17 | - (UIImage *)takeSnapshotOfFullContent { 18 | UIColor *backgroundColor = self.backgroundColor; 19 | if (backgroundColor == nil) backgroundColor = UIColor.whiteColor; 20 | 21 | UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, 0); 22 | CGContextRef context = UIGraphicsGetCurrentContext(); 23 | if (context == nil) return nil; 24 | 25 | CGContextSetFillColorWithColor(context, backgroundColor.CGColor); 26 | CGContextSetStrokeColorWithColor(context, backgroundColor.CGColor); 27 | // 使用 layer.render(in: context)的方式生成截图时,在iOS 8.0下,UIWindow展示的是WKWebView时,WKWebView区域的内容是一片空白 28 | // 使用 drawHierarchy 则无此问题 29 | [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES]; 30 | 31 | UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 32 | UIGraphicsEndImageContext(); 33 | 34 | return image; 35 | } 36 | 37 | - (void)asyncTakeSnapshotOfFullContent:(void (^)(UIImage * _Nullable))completion { 38 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 39 | UIImage *image = [self takeSnapshotOfFullContent]; 40 | if (completion) { 41 | completion(image); 42 | } 43 | }); 44 | } 45 | @end 46 | -------------------------------------------------------------------------------- /ZSSnapshotKit/WKWebView+Snapshot.h: -------------------------------------------------------------------------------- 1 | // 2 | // WKWebView+Snapshot.h 3 | // ZSSnapshotKit_master 4 | // 5 | // Created by safiri on 2019/5/21. 6 | // Copyright © 2019 safiri. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SnapshotKitProtocol.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface WKWebView (Snapshot) 15 | 16 | 17 | @end 18 | 19 | NS_ASSUME_NONNULL_END 20 | -------------------------------------------------------------------------------- /ZSSnapshotKit/WKWebView+Snapshot.m: -------------------------------------------------------------------------------- 1 | // 2 | // WKWebView+Snapshot.m 3 | // ZSSnapshotKit_master 4 | // 5 | // Created by safiri on 2019/5/21. 6 | // Copyright © 2019 safiri. All rights reserved. 7 | // 8 | 9 | #import "WKWebView+Snapshot.h" 10 | #import "WebViewPrintPageRenderer.h" 11 | 12 | @implementation WKWebView (Snapshot) 13 | 14 | - (UIImage *)takeSnapshotOfVisibleContent { 15 | 16 | UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, 0); 17 | 18 | [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES]; 19 | 20 | UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 21 | 22 | UIGraphicsEndImageContext(); 23 | 24 | return image; 25 | } 26 | 27 | - (UIImage *)takeSnapshotOfFullContent { 28 | WebViewPrintPageRenderer *render = [[WebViewPrintPageRenderer alloc] initFormatter:self.viewPrintFormatter contentSize:self.scrollView.contentSize]; 29 | UIImage *image = [render printContentToImage]; 30 | return image; 31 | } 32 | 33 | - (void)asyncTakeSnapshotOfFullContent:(void (^)(UIImage * _Nullable))completion { 34 | //在截图之前先将用户看到的当前页面截取下来,作为一张图片挡住接下来所执行的截取操作, 35 | //并且在执行完截图操作后,将截取的遮盖图片销毁。 36 | UIImageView *coverImageView = [[UIImageView alloc] initWithFrame:self.bounds]; 37 | coverImageView.image = [self takeSnapshotOfVisibleContent]; 38 | [self addSubview:coverImageView]; 39 | [self bringSubviewToFront:coverImageView]; 40 | 41 | CGPoint originalOffset = self.scrollView.contentOffset; 42 | 43 | // 当contentSize.height self.scrollView.bounds.size.height) { 46 | pageNum = (NSInteger)floorf(self.scrollView.contentSize.height/self.scrollView.bounds.size.height); 47 | } 48 | 49 | [self loadPageContentIndex:0 maxIndex:pageNum completion:^{ 50 | [self.scrollView setContentOffset:CGPointZero]; 51 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 52 | WebViewPrintPageRenderer *render = [[WebViewPrintPageRenderer alloc] initFormatter:self.viewPrintFormatter contentSize:self.scrollView.contentSize]; 53 | UIImage *image = [render printContentToImage]; 54 | self.scrollView.contentOffset = originalOffset; 55 | [coverImageView removeFromSuperview]; 56 | if (completion) completion(image); 57 | }); 58 | }]; 59 | } 60 | 61 | - (void)loadPageContentIndex:(NSInteger)index maxIndex:(NSInteger)maxIndex completion:(void(^)(void))completion { 62 | 63 | [self.scrollView setContentOffset:CGPointMake(0, index * self.scrollView.frame.size.height)]; 64 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 65 | if (index < maxIndex) { 66 | [self loadPageContentIndex:index + 1 maxIndex:maxIndex completion:completion]; 67 | }else { 68 | if (completion) completion(); 69 | } 70 | }); 71 | } 72 | @end 73 | -------------------------------------------------------------------------------- /ZSSnapshotKit/WebViewPrintPageRenderer.h: -------------------------------------------------------------------------------- 1 | // 2 | // WebViewPrintPageRenderer.h 3 | // ZSSnapshotKit_master 4 | // 5 | // Created by safiri on 2019/5/21. 6 | // Copyright © 2019 safiri. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface WebViewPrintPageRenderer : UIPrintPageRenderer 14 | 15 | - (instancetype)initFormatter:(UIPrintFormatter *)formatter contentSize:(CGSize)contentSize; 16 | 17 | - (UIImage * _Nullable)printContentToImage; 18 | 19 | @end 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /ZSSnapshotKit/WebViewPrintPageRenderer.m: -------------------------------------------------------------------------------- 1 | // 2 | // WebViewPrintPageRenderer.m 3 | // ZSSnapshotKit_master 4 | // 5 | // Created by safiri on 2019/5/21. 6 | // Copyright © 2019 safiri. All rights reserved. 7 | // 8 | 9 | #import "WebViewPrintPageRenderer.h" 10 | 11 | @interface WebViewPrintPageRenderer () 12 | 13 | @property (nonatomic, strong) UIPrintFormatter *formatter; 14 | 15 | @property (nonatomic, assign) CGSize contentSize; 16 | 17 | @end 18 | 19 | @implementation WebViewPrintPageRenderer 20 | 21 | - (instancetype)initFormatter:(UIPrintFormatter *)formatter contentSize:(CGSize)contentSize { 22 | self = [super init]; 23 | if (self) { 24 | self.formatter = formatter; 25 | self.contentSize = contentSize; 26 | [self addPrintFormatter:formatter startingAtPageAtIndex:0]; 27 | } 28 | return self; 29 | } 30 | 31 | - (UIImage *)printContentToImage { 32 | CGPDFPageRef pdfPage = [self printContentToPDFPage]; 33 | if (!pdfPage) return nil; 34 | UIImage *image = [self covertPDFPageToImage:pdfPage]; 35 | return image; 36 | } 37 | 38 | // MARK: Private 39 | 40 | - (CGRect)paperRect { 41 | return CGRectMake(0, 0, self.contentSize.width, self.contentSize.height); 42 | } 43 | 44 | - (CGRect)printableRect { 45 | return CGRectMake(0, 0, self.contentSize.width, self.contentSize.height); 46 | } 47 | 48 | - (CGPDFPageRef)printContentToPDFPage { 49 | NSMutableData *data = [NSMutableData data]; 50 | UIGraphicsBeginPDFContextToData(data, self.paperRect, nil); 51 | [self prepareForDrawingPages:NSMakeRange(0, 1)]; 52 | UIGraphicsBeginPDFPage(); 53 | [self drawPageAtIndex:0 inRect:UIGraphicsGetPDFContextBounds()]; 54 | UIGraphicsEndPDFContext(); 55 | 56 | CFDataRef cfData = (__bridge CFDataRef)(data); 57 | CGDataProviderRef provider = CGDataProviderCreateWithCFData(cfData); 58 | if (!provider) return nil; 59 | 60 | CGPDFDocumentRef pdfDocument = CGPDFDocumentCreateWithProvider(provider); 61 | CGPDFPageRef pdfPage = CGPDFDocumentGetPage(pdfDocument, 1); 62 | 63 | return pdfPage; 64 | } 65 | 66 | - (UIImage *)covertPDFPageToImage:(CGPDFPageRef)pdfPage { 67 | 68 | CGRect pageRect = CGPDFPageGetBoxRect(pdfPage, kCGPDFTrimBox); 69 | CGSize contentSize = CGSizeMake(floor(pageRect.size.width), floor(pageRect.size.height)); 70 | 71 | // usually you want UIGraphicsBeginImageContextWithOptions last parameter to be 0.0 as this will us the device's scale 72 | UIGraphicsBeginImageContextWithOptions(contentSize, YES, 2.0); 73 | CGContextRef context = UIGraphicsGetCurrentContext(); 74 | if (!context) return nil; 75 | 76 | CGContextSetFillColorWithColor(context, UIColor.whiteColor.CGColor); 77 | CGContextSetStrokeColorWithColor(context, UIColor.whiteColor.CGColor); 78 | CGContextFillRect(context, pageRect); 79 | 80 | CGContextSaveGState(context); 81 | CGContextTranslateCTM(context, 0, contentSize.height); 82 | CGContextScaleCTM(context, 1.0, -1.0); 83 | 84 | CGContextSetInterpolationQuality(context, kCGInterpolationDefault); 85 | CGContextDrawPDFPage(context, pdfPage); 86 | CGContextRestoreGState(context); 87 | 88 | UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 89 | UIGraphicsEndImageContext(); 90 | return image; 91 | } 92 | 93 | 94 | @end 95 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 036148522293C65D0093D9F1 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 036148512293C65D0093D9F1 /* AppDelegate.m */; }; 11 | 036148552293C65D0093D9F1 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 036148542293C65D0093D9F1 /* ViewController.m */; }; 12 | 036148582293C65D0093D9F1 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 036148562293C65D0093D9F1 /* Main.storyboard */; }; 13 | 0361485A2293C65F0093D9F1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 036148592293C65F0093D9F1 /* Assets.xcassets */; }; 14 | 0361485D2293C65F0093D9F1 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0361485B2293C65F0093D9F1 /* LaunchScreen.storyboard */; }; 15 | 036148602293C65F0093D9F1 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 0361485F2293C65F0093D9F1 /* main.m */; }; 16 | 0361486A2293C8370093D9F1 /* WKWebView+Snapshot.m in Sources */ = {isa = PBXBuildFile; fileRef = 036148692293C8370093D9F1 /* WKWebView+Snapshot.m */; }; 17 | 0361486E2293CE060093D9F1 /* WebViewPrintPageRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = 0361486D2293CE060093D9F1 /* WebViewPrintPageRenderer.m */; }; 18 | 036148722293E0B70093D9F1 /* WKWebViewTesterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 036148712293E0B70093D9F1 /* WKWebViewTesterViewController.m */; }; 19 | 036148802293E81D0093D9F1 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 036148742293E81D0093D9F1 /* LICENSE */; }; 20 | 036148812293E81D0093D9F1 /* SVRadialGradientLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 036148762293E81D0093D9F1 /* SVRadialGradientLayer.m */; }; 21 | 036148822293E81D0093D9F1 /* SVProgressAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 036148792293E81D0093D9F1 /* SVProgressAnimatedView.m */; }; 22 | 036148832293E81D0093D9F1 /* SVProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 0361487B2293E81D0093D9F1 /* SVProgressHUD.m */; }; 23 | 036148842293E81D0093D9F1 /* SVIndefiniteAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0361487C2293E81D0093D9F1 /* SVIndefiniteAnimatedView.m */; }; 24 | 036148852293E81D0093D9F1 /* SVProgressHUD.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 0361487D2293E81D0093D9F1 /* SVProgressHUD.bundle */; }; 25 | 036148862293E81D0093D9F1 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = 0361487F2293E81D0093D9F1 /* README.md */; }; 26 | 03E280502294D7B80037E2BA /* wzxwfx-luan.png in Resources */ = {isa = PBXBuildFile; fileRef = 03E280332294D7B80037E2BA /* wzxwfx-luan.png */; }; 27 | 03E280512294D7B80037E2BA /* wzxwfx-mi.png in Resources */ = {isa = PBXBuildFile; fileRef = 03E280342294D7B80037E2BA /* wzxwfx-mi.png */; }; 28 | 03E280522294D7B80037E2BA /* wzxwfx-lz.png in Resources */ = {isa = PBXBuildFile; fileRef = 03E280352294D7B80037E2BA /* wzxwfx-lz.png */; }; 29 | 03E280532294D7B80037E2BA /* wzxwfx-banner.png in Resources */ = {isa = PBXBuildFile; fileRef = 03E280362294D7B80037E2BA /* wzxwfx-banner.png */; }; 30 | 03E280542294D7B80037E2BA /* weizhangdidian.png in Resources */ = {isa = PBXBuildFile; fileRef = 03E280372294D7B80037E2BA /* weizhangdidian.png */; }; 31 | 03E280552294D7B80037E2BA /* qiehuan-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 03E280382294D7B80037E2BA /* qiehuan-icon.png */; }; 32 | 03E280562294D7B80037E2BA /* zhuanquanquna.gif in Resources */ = {isa = PBXBuildFile; fileRef = 03E280392294D7B80037E2BA /* zhuanquanquna.gif */; }; 33 | 03E280572294D7B80037E2BA /* wzxwfx-sid.png in Resources */ = {isa = PBXBuildFile; fileRef = 03E2803A2294D7B80037E2BA /* wzxwfx-sid.png */; }; 34 | 03E280582294D7B80037E2BA /* wzxwfx-jieguo.png in Resources */ = {isa = PBXBuildFile; fileRef = 03E2803B2294D7B80037E2BA /* wzxwfx-jieguo.png */; }; 35 | 03E280592294D7B80037E2BA /* wzxwfx-wen.png in Resources */ = {isa = PBXBuildFile; fileRef = 03E2803C2294D7B80037E2BA /* wzxwfx-wen.png */; }; 36 | 03E2805A2294D7B80037E2BA /* dibupic.png in Resources */ = {isa = PBXBuildFile; fileRef = 03E2803D2294D7B80037E2BA /* dibupic.png */; }; 37 | 03E2805B2294D7B80037E2BA /* linghongbaobanner.png in Resources */ = {isa = PBXBuildFile; fileRef = 03E2803E2294D7B80037E2BA /* linghongbaobanner.png */; }; 38 | 03E2805C2294D7B80037E2BA /* wzxwfx-can.png in Resources */ = {isa = PBXBuildFile; fileRef = 03E2803F2294D7B80037E2BA /* wzxwfx-can.png */; }; 39 | 03E2805D2294D7B80037E2BA /* wzxwfx-shuai.png in Resources */ = {isa = PBXBuildFile; fileRef = 03E280402294D7B80037E2BA /* wzxwfx-shuai.png */; }; 40 | 03E2805E2294D7B80037E2BA /* wzxwfx-sid2.png in Resources */ = {isa = PBXBuildFile; fileRef = 03E280412294D7B80037E2BA /* wzxwfx-sid2.png */; }; 41 | 03E2805F2294D7B80037E2BA /* wzxwfx-che.png in Resources */ = {isa = PBXBuildFile; fileRef = 03E280422294D7B80037E2BA /* wzxwfx-che.png */; }; 42 | 03E280602294D7B80037E2BA /* wzxwfx-lu.png in Resources */ = {isa = PBXBuildFile; fileRef = 03E280432294D7B80037E2BA /* wzxwfx-lu.png */; }; 43 | 03E280612294D7B80037E2BA /* aui.css in Resources */ = {isa = PBXBuildFile; fileRef = 03E280452294D7B80037E2BA /* aui.css */; }; 44 | 03E280622294D7B80037E2BA /* wzfxstyle.css in Resources */ = {isa = PBXBuildFile; fileRef = 03E280462294D7B80037E2BA /* wzfxstyle.css */; }; 45 | 03E280632294D7B80037E2BA /* mobiscroll.custom-2.17.0.min-zh.js in Resources */ = {isa = PBXBuildFile; fileRef = 03E280482294D7B80037E2BA /* mobiscroll.custom-2.17.0.min-zh.js */; }; 46 | 03E280642294D7B80037E2BA /* jquery.circliful.js in Resources */ = {isa = PBXBuildFile; fileRef = 03E280492294D7B80037E2BA /* jquery.circliful.js */; }; 47 | 03E280652294D7B80037E2BA /* jQuery-v3.1.1.js in Resources */ = {isa = PBXBuildFile; fileRef = 03E2804A2294D7B80037E2BA /* jQuery-v3.1.1.js */; }; 48 | 03E280662294D7B80037E2BA /* echarts.min.js in Resources */ = {isa = PBXBuildFile; fileRef = 03E2804B2294D7B80037E2BA /* echarts.min.js */; }; 49 | 03E280672294D7B80037E2BA /* jaizaizhong.html in Resources */ = {isa = PBXBuildFile; fileRef = 03E2804D2294D7B80037E2BA /* jaizaizhong.html */; }; 50 | 03E280682294D7B80037E2BA /* weizhangfenxi.html in Resources */ = {isa = PBXBuildFile; fileRef = 03E2804E2294D7B80037E2BA /* weizhangfenxi.html */; }; 51 | 03E280692294D7B80037E2BA /* qiehuancheliang.html in Resources */ = {isa = PBXBuildFile; fileRef = 03E2804F2294D7B80037E2BA /* qiehuancheliang.html */; }; 52 | 03E280A12294F9A40037E2BA /* UIScrollView+Snapshot.m in Sources */ = {isa = PBXBuildFile; fileRef = 03E280A02294F9A40037E2BA /* UIScrollView+Snapshot.m */; }; 53 | 03E280A42294FCFB0037E2BA /* UIView+Snapshot.m in Sources */ = {isa = PBXBuildFile; fileRef = 03E280A32294FCFB0037E2BA /* UIView+Snapshot.m */; }; 54 | 03E280A722951DCD0037E2BA /* UIWindow+Snapshot.m in Sources */ = {isa = PBXBuildFile; fileRef = 03E280A622951DCD0037E2BA /* UIWindow+Snapshot.m */; }; 55 | 03E280AA229522830037E2BA /* UIWebView+Snapshot.m in Sources */ = {isa = PBXBuildFile; fileRef = 03E280A9229522830037E2BA /* UIWebView+Snapshot.m */; }; 56 | 03E280AD22952D8C0037E2BA /* UITableView+Snapshot.m in Sources */ = {isa = PBXBuildFile; fileRef = 03E280AC22952D8C0037E2BA /* UITableView+Snapshot.m */; }; 57 | /* End PBXBuildFile section */ 58 | 59 | /* Begin PBXFileReference section */ 60 | 0361484D2293C65D0093D9F1 /* ZSSnapshotKit_master.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ZSSnapshotKit_master.app; sourceTree = BUILT_PRODUCTS_DIR; }; 61 | 036148502293C65D0093D9F1 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 62 | 036148512293C65D0093D9F1 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 63 | 036148532293C65D0093D9F1 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 64 | 036148542293C65D0093D9F1 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 65 | 036148572293C65D0093D9F1 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 66 | 036148592293C65F0093D9F1 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 67 | 0361485C2293C65F0093D9F1 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 68 | 0361485E2293C65F0093D9F1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 69 | 0361485F2293C65F0093D9F1 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 70 | 036148682293C8370093D9F1 /* WKWebView+Snapshot.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WKWebView+Snapshot.h"; sourceTree = ""; }; 71 | 036148692293C8370093D9F1 /* WKWebView+Snapshot.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "WKWebView+Snapshot.m"; sourceTree = ""; }; 72 | 0361486B2293C9290093D9F1 /* SnapshotKitProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SnapshotKitProtocol.h; sourceTree = ""; }; 73 | 0361486C2293CE060093D9F1 /* WebViewPrintPageRenderer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebViewPrintPageRenderer.h; sourceTree = ""; }; 74 | 0361486D2293CE060093D9F1 /* WebViewPrintPageRenderer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WebViewPrintPageRenderer.m; sourceTree = ""; }; 75 | 036148702293E0B70093D9F1 /* WKWebViewTesterViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKWebViewTesterViewController.h; sourceTree = ""; }; 76 | 036148712293E0B70093D9F1 /* WKWebViewTesterViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WKWebViewTesterViewController.m; sourceTree = ""; }; 77 | 036148742293E81D0093D9F1 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; 78 | 036148762293E81D0093D9F1 /* SVRadialGradientLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVRadialGradientLayer.m; sourceTree = ""; }; 79 | 036148772293E81D0093D9F1 /* SVIndefiniteAnimatedView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVIndefiniteAnimatedView.h; sourceTree = ""; }; 80 | 036148782293E81D0093D9F1 /* SVProgressHUD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVProgressHUD.h; sourceTree = ""; }; 81 | 036148792293E81D0093D9F1 /* SVProgressAnimatedView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVProgressAnimatedView.m; sourceTree = ""; }; 82 | 0361487A2293E81D0093D9F1 /* SVRadialGradientLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVRadialGradientLayer.h; sourceTree = ""; }; 83 | 0361487B2293E81D0093D9F1 /* SVProgressHUD.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVProgressHUD.m; sourceTree = ""; }; 84 | 0361487C2293E81D0093D9F1 /* SVIndefiniteAnimatedView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVIndefiniteAnimatedView.m; sourceTree = ""; }; 85 | 0361487D2293E81D0093D9F1 /* SVProgressHUD.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = SVProgressHUD.bundle; sourceTree = ""; }; 86 | 0361487E2293E81D0093D9F1 /* SVProgressAnimatedView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVProgressAnimatedView.h; sourceTree = ""; }; 87 | 0361487F2293E81D0093D9F1 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 88 | 03E280332294D7B80037E2BA /* wzxwfx-luan.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "wzxwfx-luan.png"; sourceTree = ""; }; 89 | 03E280342294D7B80037E2BA /* wzxwfx-mi.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "wzxwfx-mi.png"; sourceTree = ""; }; 90 | 03E280352294D7B80037E2BA /* wzxwfx-lz.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "wzxwfx-lz.png"; sourceTree = ""; }; 91 | 03E280362294D7B80037E2BA /* wzxwfx-banner.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "wzxwfx-banner.png"; sourceTree = ""; }; 92 | 03E280372294D7B80037E2BA /* weizhangdidian.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = weizhangdidian.png; sourceTree = ""; }; 93 | 03E280382294D7B80037E2BA /* qiehuan-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "qiehuan-icon.png"; sourceTree = ""; }; 94 | 03E280392294D7B80037E2BA /* zhuanquanquna.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = zhuanquanquna.gif; sourceTree = ""; }; 95 | 03E2803A2294D7B80037E2BA /* wzxwfx-sid.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "wzxwfx-sid.png"; sourceTree = ""; }; 96 | 03E2803B2294D7B80037E2BA /* wzxwfx-jieguo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "wzxwfx-jieguo.png"; sourceTree = ""; }; 97 | 03E2803C2294D7B80037E2BA /* wzxwfx-wen.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "wzxwfx-wen.png"; sourceTree = ""; }; 98 | 03E2803D2294D7B80037E2BA /* dibupic.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = dibupic.png; sourceTree = ""; }; 99 | 03E2803E2294D7B80037E2BA /* linghongbaobanner.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = linghongbaobanner.png; sourceTree = ""; }; 100 | 03E2803F2294D7B80037E2BA /* wzxwfx-can.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "wzxwfx-can.png"; sourceTree = ""; }; 101 | 03E280402294D7B80037E2BA /* wzxwfx-shuai.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "wzxwfx-shuai.png"; sourceTree = ""; }; 102 | 03E280412294D7B80037E2BA /* wzxwfx-sid2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "wzxwfx-sid2.png"; sourceTree = ""; }; 103 | 03E280422294D7B80037E2BA /* wzxwfx-che.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "wzxwfx-che.png"; sourceTree = ""; }; 104 | 03E280432294D7B80037E2BA /* wzxwfx-lu.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "wzxwfx-lu.png"; sourceTree = ""; }; 105 | 03E280452294D7B80037E2BA /* aui.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = aui.css; sourceTree = ""; }; 106 | 03E280462294D7B80037E2BA /* wzfxstyle.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = wzfxstyle.css; sourceTree = ""; }; 107 | 03E280482294D7B80037E2BA /* mobiscroll.custom-2.17.0.min-zh.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = "mobiscroll.custom-2.17.0.min-zh.js"; sourceTree = ""; }; 108 | 03E280492294D7B80037E2BA /* jquery.circliful.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = jquery.circliful.js; sourceTree = ""; }; 109 | 03E2804A2294D7B80037E2BA /* jQuery-v3.1.1.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = "jQuery-v3.1.1.js"; sourceTree = ""; }; 110 | 03E2804B2294D7B80037E2BA /* echarts.min.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = echarts.min.js; sourceTree = ""; }; 111 | 03E2804D2294D7B80037E2BA /* jaizaizhong.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = jaizaizhong.html; sourceTree = ""; }; 112 | 03E2804E2294D7B80037E2BA /* weizhangfenxi.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = weizhangfenxi.html; sourceTree = ""; }; 113 | 03E2804F2294D7B80037E2BA /* qiehuancheliang.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = qiehuancheliang.html; sourceTree = ""; }; 114 | 03E2809F2294F9A40037E2BA /* UIScrollView+Snapshot.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIScrollView+Snapshot.h"; sourceTree = ""; }; 115 | 03E280A02294F9A40037E2BA /* UIScrollView+Snapshot.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIScrollView+Snapshot.m"; sourceTree = ""; }; 116 | 03E280A22294FCFB0037E2BA /* UIView+Snapshot.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIView+Snapshot.h"; sourceTree = ""; }; 117 | 03E280A32294FCFB0037E2BA /* UIView+Snapshot.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIView+Snapshot.m"; sourceTree = ""; }; 118 | 03E280A522951DCD0037E2BA /* UIWindow+Snapshot.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIWindow+Snapshot.h"; sourceTree = ""; }; 119 | 03E280A622951DCD0037E2BA /* UIWindow+Snapshot.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIWindow+Snapshot.m"; sourceTree = ""; }; 120 | 03E280A8229522830037E2BA /* UIWebView+Snapshot.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIWebView+Snapshot.h"; sourceTree = ""; }; 121 | 03E280A9229522830037E2BA /* UIWebView+Snapshot.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIWebView+Snapshot.m"; sourceTree = ""; }; 122 | 03E280AB22952D8C0037E2BA /* UITableView+Snapshot.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UITableView+Snapshot.h"; sourceTree = ""; }; 123 | 03E280AC22952D8C0037E2BA /* UITableView+Snapshot.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UITableView+Snapshot.m"; sourceTree = ""; }; 124 | /* End PBXFileReference section */ 125 | 126 | /* Begin PBXFrameworksBuildPhase section */ 127 | 0361484A2293C65D0093D9F1 /* Frameworks */ = { 128 | isa = PBXFrameworksBuildPhase; 129 | buildActionMask = 2147483647; 130 | files = ( 131 | ); 132 | runOnlyForDeploymentPostprocessing = 0; 133 | }; 134 | /* End PBXFrameworksBuildPhase section */ 135 | 136 | /* Begin PBXGroup section */ 137 | 036148442293C65D0093D9F1 = { 138 | isa = PBXGroup; 139 | children = ( 140 | 036148672293C6A70093D9F1 /* ZSSnapshotKit */, 141 | 0361484F2293C65D0093D9F1 /* ZSSnapshotKit_master */, 142 | 0361484E2293C65D0093D9F1 /* Products */, 143 | ); 144 | sourceTree = ""; 145 | }; 146 | 0361484E2293C65D0093D9F1 /* Products */ = { 147 | isa = PBXGroup; 148 | children = ( 149 | 0361484D2293C65D0093D9F1 /* ZSSnapshotKit_master.app */, 150 | ); 151 | name = Products; 152 | sourceTree = ""; 153 | }; 154 | 0361484F2293C65D0093D9F1 /* ZSSnapshotKit_master */ = { 155 | isa = PBXGroup; 156 | children = ( 157 | 03E280312294D7AA0037E2BA /* Source */, 158 | 036148732293E81D0093D9F1 /* SVProgressHUD */, 159 | 036148502293C65D0093D9F1 /* AppDelegate.h */, 160 | 036148512293C65D0093D9F1 /* AppDelegate.m */, 161 | 036148532293C65D0093D9F1 /* ViewController.h */, 162 | 036148542293C65D0093D9F1 /* ViewController.m */, 163 | 0361486F2293E0950093D9F1 /* WebViewTester */, 164 | 036148562293C65D0093D9F1 /* Main.storyboard */, 165 | 036148592293C65F0093D9F1 /* Assets.xcassets */, 166 | 0361485B2293C65F0093D9F1 /* LaunchScreen.storyboard */, 167 | 0361485E2293C65F0093D9F1 /* Info.plist */, 168 | 0361485F2293C65F0093D9F1 /* main.m */, 169 | ); 170 | path = ZSSnapshotKit_master; 171 | sourceTree = ""; 172 | }; 173 | 036148672293C6A70093D9F1 /* ZSSnapshotKit */ = { 174 | isa = PBXGroup; 175 | children = ( 176 | 0361486B2293C9290093D9F1 /* SnapshotKitProtocol.h */, 177 | 0361486C2293CE060093D9F1 /* WebViewPrintPageRenderer.h */, 178 | 0361486D2293CE060093D9F1 /* WebViewPrintPageRenderer.m */, 179 | 036148682293C8370093D9F1 /* WKWebView+Snapshot.h */, 180 | 036148692293C8370093D9F1 /* WKWebView+Snapshot.m */, 181 | 03E280A8229522830037E2BA /* UIWebView+Snapshot.h */, 182 | 03E280A9229522830037E2BA /* UIWebView+Snapshot.m */, 183 | 03E2809F2294F9A40037E2BA /* UIScrollView+Snapshot.h */, 184 | 03E280A02294F9A40037E2BA /* UIScrollView+Snapshot.m */, 185 | 03E280AB22952D8C0037E2BA /* UITableView+Snapshot.h */, 186 | 03E280AC22952D8C0037E2BA /* UITableView+Snapshot.m */, 187 | 03E280A22294FCFB0037E2BA /* UIView+Snapshot.h */, 188 | 03E280A32294FCFB0037E2BA /* UIView+Snapshot.m */, 189 | 03E280A522951DCD0037E2BA /* UIWindow+Snapshot.h */, 190 | 03E280A622951DCD0037E2BA /* UIWindow+Snapshot.m */, 191 | ); 192 | name = ZSSnapshotKit; 193 | path = ../ZSSnapshotKit; 194 | sourceTree = ""; 195 | }; 196 | 0361486F2293E0950093D9F1 /* WebViewTester */ = { 197 | isa = PBXGroup; 198 | children = ( 199 | 036148702293E0B70093D9F1 /* WKWebViewTesterViewController.h */, 200 | 036148712293E0B70093D9F1 /* WKWebViewTesterViewController.m */, 201 | ); 202 | path = WebViewTester; 203 | sourceTree = ""; 204 | }; 205 | 036148732293E81D0093D9F1 /* SVProgressHUD */ = { 206 | isa = PBXGroup; 207 | children = ( 208 | 036148742293E81D0093D9F1 /* LICENSE */, 209 | 036148752293E81D0093D9F1 /* SVProgressHUD */, 210 | 0361487F2293E81D0093D9F1 /* README.md */, 211 | ); 212 | path = SVProgressHUD; 213 | sourceTree = ""; 214 | }; 215 | 036148752293E81D0093D9F1 /* SVProgressHUD */ = { 216 | isa = PBXGroup; 217 | children = ( 218 | 036148772293E81D0093D9F1 /* SVIndefiniteAnimatedView.h */, 219 | 0361487C2293E81D0093D9F1 /* SVIndefiniteAnimatedView.m */, 220 | 0361487E2293E81D0093D9F1 /* SVProgressAnimatedView.h */, 221 | 036148792293E81D0093D9F1 /* SVProgressAnimatedView.m */, 222 | 0361487D2293E81D0093D9F1 /* SVProgressHUD.bundle */, 223 | 036148782293E81D0093D9F1 /* SVProgressHUD.h */, 224 | 0361487B2293E81D0093D9F1 /* SVProgressHUD.m */, 225 | 0361487A2293E81D0093D9F1 /* SVRadialGradientLayer.h */, 226 | 036148762293E81D0093D9F1 /* SVRadialGradientLayer.m */, 227 | ); 228 | path = SVProgressHUD; 229 | sourceTree = ""; 230 | }; 231 | 03E280312294D7AA0037E2BA /* Source */ = { 232 | isa = PBXGroup; 233 | children = ( 234 | 03E280442294D7B80037E2BA /* css */, 235 | 03E2804C2294D7B80037E2BA /* html */, 236 | 03E280322294D7B80037E2BA /* img */, 237 | 03E280472294D7B80037E2BA /* js */, 238 | ); 239 | path = Source; 240 | sourceTree = ""; 241 | }; 242 | 03E280322294D7B80037E2BA /* img */ = { 243 | isa = PBXGroup; 244 | children = ( 245 | ); 246 | path = img; 247 | sourceTree = ""; 248 | }; 249 | 03E280442294D7B80037E2BA /* css */ = { 250 | isa = PBXGroup; 251 | children = ( 252 | ); 253 | path = css; 254 | sourceTree = ""; 255 | }; 256 | 03E280472294D7B80037E2BA /* js */ = { 257 | isa = PBXGroup; 258 | children = ( 259 | ); 260 | path = js; 261 | sourceTree = ""; 262 | }; 263 | 03E2804C2294D7B80037E2BA /* html */ = { 264 | isa = PBXGroup; 265 | children = ( 266 | 03E280452294D7B80037E2BA /* aui.css */, 267 | 03E280462294D7B80037E2BA /* wzfxstyle.css */, 268 | 03E280332294D7B80037E2BA /* wzxwfx-luan.png */, 269 | 03E280342294D7B80037E2BA /* wzxwfx-mi.png */, 270 | 03E280352294D7B80037E2BA /* wzxwfx-lz.png */, 271 | 03E280362294D7B80037E2BA /* wzxwfx-banner.png */, 272 | 03E280372294D7B80037E2BA /* weizhangdidian.png */, 273 | 03E280382294D7B80037E2BA /* qiehuan-icon.png */, 274 | 03E280392294D7B80037E2BA /* zhuanquanquna.gif */, 275 | 03E2803A2294D7B80037E2BA /* wzxwfx-sid.png */, 276 | 03E2803B2294D7B80037E2BA /* wzxwfx-jieguo.png */, 277 | 03E2803C2294D7B80037E2BA /* wzxwfx-wen.png */, 278 | 03E2803D2294D7B80037E2BA /* dibupic.png */, 279 | 03E2803E2294D7B80037E2BA /* linghongbaobanner.png */, 280 | 03E2803F2294D7B80037E2BA /* wzxwfx-can.png */, 281 | 03E280402294D7B80037E2BA /* wzxwfx-shuai.png */, 282 | 03E280412294D7B80037E2BA /* wzxwfx-sid2.png */, 283 | 03E280422294D7B80037E2BA /* wzxwfx-che.png */, 284 | 03E280432294D7B80037E2BA /* wzxwfx-lu.png */, 285 | 03E280482294D7B80037E2BA /* mobiscroll.custom-2.17.0.min-zh.js */, 286 | 03E280492294D7B80037E2BA /* jquery.circliful.js */, 287 | 03E2804A2294D7B80037E2BA /* jQuery-v3.1.1.js */, 288 | 03E2804B2294D7B80037E2BA /* echarts.min.js */, 289 | 03E2804D2294D7B80037E2BA /* jaizaizhong.html */, 290 | 03E2804E2294D7B80037E2BA /* weizhangfenxi.html */, 291 | 03E2804F2294D7B80037E2BA /* qiehuancheliang.html */, 292 | ); 293 | path = html; 294 | sourceTree = ""; 295 | }; 296 | /* End PBXGroup section */ 297 | 298 | /* Begin PBXNativeTarget section */ 299 | 0361484C2293C65D0093D9F1 /* ZSSnapshotKit_master */ = { 300 | isa = PBXNativeTarget; 301 | buildConfigurationList = 036148632293C65F0093D9F1 /* Build configuration list for PBXNativeTarget "ZSSnapshotKit_master" */; 302 | buildPhases = ( 303 | 036148492293C65D0093D9F1 /* Sources */, 304 | 0361484A2293C65D0093D9F1 /* Frameworks */, 305 | 0361484B2293C65D0093D9F1 /* Resources */, 306 | ); 307 | buildRules = ( 308 | ); 309 | dependencies = ( 310 | ); 311 | name = ZSSnapshotKit_master; 312 | productName = ZSSnapshotKit_master; 313 | productReference = 0361484D2293C65D0093D9F1 /* ZSSnapshotKit_master.app */; 314 | productType = "com.apple.product-type.application"; 315 | }; 316 | /* End PBXNativeTarget section */ 317 | 318 | /* Begin PBXProject section */ 319 | 036148452293C65D0093D9F1 /* Project object */ = { 320 | isa = PBXProject; 321 | attributes = { 322 | LastUpgradeCheck = 1020; 323 | ORGANIZATIONNAME = safiri; 324 | TargetAttributes = { 325 | 0361484C2293C65D0093D9F1 = { 326 | CreatedOnToolsVersion = 10.2.1; 327 | }; 328 | }; 329 | }; 330 | buildConfigurationList = 036148482293C65D0093D9F1 /* Build configuration list for PBXProject "ZSSnapshotKit_master" */; 331 | compatibilityVersion = "Xcode 9.3"; 332 | developmentRegion = en; 333 | hasScannedForEncodings = 0; 334 | knownRegions = ( 335 | en, 336 | Base, 337 | ); 338 | mainGroup = 036148442293C65D0093D9F1; 339 | productRefGroup = 0361484E2293C65D0093D9F1 /* Products */; 340 | projectDirPath = ""; 341 | projectRoot = ""; 342 | targets = ( 343 | 0361484C2293C65D0093D9F1 /* ZSSnapshotKit_master */, 344 | ); 345 | }; 346 | /* End PBXProject section */ 347 | 348 | /* Begin PBXResourcesBuildPhase section */ 349 | 0361484B2293C65D0093D9F1 /* Resources */ = { 350 | isa = PBXResourcesBuildPhase; 351 | buildActionMask = 2147483647; 352 | files = ( 353 | 03E280572294D7B80037E2BA /* wzxwfx-sid.png in Resources */, 354 | 03E280522294D7B80037E2BA /* wzxwfx-lz.png in Resources */, 355 | 036148862293E81D0093D9F1 /* README.md in Resources */, 356 | 03E280512294D7B80037E2BA /* wzxwfx-mi.png in Resources */, 357 | 036148852293E81D0093D9F1 /* SVProgressHUD.bundle in Resources */, 358 | 03E280562294D7B80037E2BA /* zhuanquanquna.gif in Resources */, 359 | 03E280592294D7B80037E2BA /* wzxwfx-wen.png in Resources */, 360 | 03E2805E2294D7B80037E2BA /* wzxwfx-sid2.png in Resources */, 361 | 03E280622294D7B80037E2BA /* wzfxstyle.css in Resources */, 362 | 03E280672294D7B80037E2BA /* jaizaizhong.html in Resources */, 363 | 03E2805C2294D7B80037E2BA /* wzxwfx-can.png in Resources */, 364 | 03E280542294D7B80037E2BA /* weizhangdidian.png in Resources */, 365 | 03E280682294D7B80037E2BA /* weizhangfenxi.html in Resources */, 366 | 03E2805F2294D7B80037E2BA /* wzxwfx-che.png in Resources */, 367 | 0361485D2293C65F0093D9F1 /* LaunchScreen.storyboard in Resources */, 368 | 03E280502294D7B80037E2BA /* wzxwfx-luan.png in Resources */, 369 | 03E280662294D7B80037E2BA /* echarts.min.js in Resources */, 370 | 03E280642294D7B80037E2BA /* jquery.circliful.js in Resources */, 371 | 03E280652294D7B80037E2BA /* jQuery-v3.1.1.js in Resources */, 372 | 0361485A2293C65F0093D9F1 /* Assets.xcassets in Resources */, 373 | 03E280552294D7B80037E2BA /* qiehuan-icon.png in Resources */, 374 | 03E2805B2294D7B80037E2BA /* linghongbaobanner.png in Resources */, 375 | 03E280582294D7B80037E2BA /* wzxwfx-jieguo.png in Resources */, 376 | 03E280602294D7B80037E2BA /* wzxwfx-lu.png in Resources */, 377 | 036148802293E81D0093D9F1 /* LICENSE in Resources */, 378 | 03E2805D2294D7B80037E2BA /* wzxwfx-shuai.png in Resources */, 379 | 036148582293C65D0093D9F1 /* Main.storyboard in Resources */, 380 | 03E280632294D7B80037E2BA /* mobiscroll.custom-2.17.0.min-zh.js in Resources */, 381 | 03E280612294D7B80037E2BA /* aui.css in Resources */, 382 | 03E280692294D7B80037E2BA /* qiehuancheliang.html in Resources */, 383 | 03E280532294D7B80037E2BA /* wzxwfx-banner.png in Resources */, 384 | 03E2805A2294D7B80037E2BA /* dibupic.png in Resources */, 385 | ); 386 | runOnlyForDeploymentPostprocessing = 0; 387 | }; 388 | /* End PBXResourcesBuildPhase section */ 389 | 390 | /* Begin PBXSourcesBuildPhase section */ 391 | 036148492293C65D0093D9F1 /* Sources */ = { 392 | isa = PBXSourcesBuildPhase; 393 | buildActionMask = 2147483647; 394 | files = ( 395 | 03E280A42294FCFB0037E2BA /* UIView+Snapshot.m in Sources */, 396 | 03E280AA229522830037E2BA /* UIWebView+Snapshot.m in Sources */, 397 | 036148812293E81D0093D9F1 /* SVRadialGradientLayer.m in Sources */, 398 | 03E280AD22952D8C0037E2BA /* UITableView+Snapshot.m in Sources */, 399 | 036148552293C65D0093D9F1 /* ViewController.m in Sources */, 400 | 0361486A2293C8370093D9F1 /* WKWebView+Snapshot.m in Sources */, 401 | 036148602293C65F0093D9F1 /* main.m in Sources */, 402 | 03E280A722951DCD0037E2BA /* UIWindow+Snapshot.m in Sources */, 403 | 0361486E2293CE060093D9F1 /* WebViewPrintPageRenderer.m in Sources */, 404 | 036148842293E81D0093D9F1 /* SVIndefiniteAnimatedView.m in Sources */, 405 | 036148832293E81D0093D9F1 /* SVProgressHUD.m in Sources */, 406 | 036148522293C65D0093D9F1 /* AppDelegate.m in Sources */, 407 | 036148722293E0B70093D9F1 /* WKWebViewTesterViewController.m in Sources */, 408 | 03E280A12294F9A40037E2BA /* UIScrollView+Snapshot.m in Sources */, 409 | 036148822293E81D0093D9F1 /* SVProgressAnimatedView.m in Sources */, 410 | ); 411 | runOnlyForDeploymentPostprocessing = 0; 412 | }; 413 | /* End PBXSourcesBuildPhase section */ 414 | 415 | /* Begin PBXVariantGroup section */ 416 | 036148562293C65D0093D9F1 /* Main.storyboard */ = { 417 | isa = PBXVariantGroup; 418 | children = ( 419 | 036148572293C65D0093D9F1 /* Base */, 420 | ); 421 | name = Main.storyboard; 422 | sourceTree = ""; 423 | }; 424 | 0361485B2293C65F0093D9F1 /* LaunchScreen.storyboard */ = { 425 | isa = PBXVariantGroup; 426 | children = ( 427 | 0361485C2293C65F0093D9F1 /* Base */, 428 | ); 429 | name = LaunchScreen.storyboard; 430 | sourceTree = ""; 431 | }; 432 | /* End PBXVariantGroup section */ 433 | 434 | /* Begin XCBuildConfiguration section */ 435 | 036148612293C65F0093D9F1 /* Debug */ = { 436 | isa = XCBuildConfiguration; 437 | buildSettings = { 438 | ALWAYS_SEARCH_USER_PATHS = NO; 439 | CLANG_ANALYZER_NONNULL = YES; 440 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 441 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 442 | CLANG_CXX_LIBRARY = "libc++"; 443 | CLANG_ENABLE_MODULES = YES; 444 | CLANG_ENABLE_OBJC_ARC = YES; 445 | CLANG_ENABLE_OBJC_WEAK = YES; 446 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 447 | CLANG_WARN_BOOL_CONVERSION = YES; 448 | CLANG_WARN_COMMA = YES; 449 | CLANG_WARN_CONSTANT_CONVERSION = YES; 450 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 451 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 452 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 453 | CLANG_WARN_EMPTY_BODY = YES; 454 | CLANG_WARN_ENUM_CONVERSION = YES; 455 | CLANG_WARN_INFINITE_RECURSION = YES; 456 | CLANG_WARN_INT_CONVERSION = YES; 457 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 458 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 459 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 460 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 461 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 462 | CLANG_WARN_STRICT_PROTOTYPES = YES; 463 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 464 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 465 | CLANG_WARN_UNREACHABLE_CODE = YES; 466 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 467 | CODE_SIGN_IDENTITY = "iPhone Developer"; 468 | COPY_PHASE_STRIP = NO; 469 | DEBUG_INFORMATION_FORMAT = dwarf; 470 | ENABLE_STRICT_OBJC_MSGSEND = YES; 471 | ENABLE_TESTABILITY = YES; 472 | GCC_C_LANGUAGE_STANDARD = gnu11; 473 | GCC_DYNAMIC_NO_PIC = NO; 474 | GCC_NO_COMMON_BLOCKS = YES; 475 | GCC_OPTIMIZATION_LEVEL = 0; 476 | GCC_PREPROCESSOR_DEFINITIONS = ( 477 | "DEBUG=1", 478 | "$(inherited)", 479 | ); 480 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 481 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 482 | GCC_WARN_UNDECLARED_SELECTOR = YES; 483 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 484 | GCC_WARN_UNUSED_FUNCTION = YES; 485 | GCC_WARN_UNUSED_VARIABLE = YES; 486 | IPHONEOS_DEPLOYMENT_TARGET = 12.2; 487 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 488 | MTL_FAST_MATH = YES; 489 | ONLY_ACTIVE_ARCH = YES; 490 | SDKROOT = iphoneos; 491 | }; 492 | name = Debug; 493 | }; 494 | 036148622293C65F0093D9F1 /* Release */ = { 495 | isa = XCBuildConfiguration; 496 | buildSettings = { 497 | ALWAYS_SEARCH_USER_PATHS = NO; 498 | CLANG_ANALYZER_NONNULL = YES; 499 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 500 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 501 | CLANG_CXX_LIBRARY = "libc++"; 502 | CLANG_ENABLE_MODULES = YES; 503 | CLANG_ENABLE_OBJC_ARC = YES; 504 | CLANG_ENABLE_OBJC_WEAK = YES; 505 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 506 | CLANG_WARN_BOOL_CONVERSION = YES; 507 | CLANG_WARN_COMMA = YES; 508 | CLANG_WARN_CONSTANT_CONVERSION = YES; 509 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 510 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 511 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 512 | CLANG_WARN_EMPTY_BODY = YES; 513 | CLANG_WARN_ENUM_CONVERSION = YES; 514 | CLANG_WARN_INFINITE_RECURSION = YES; 515 | CLANG_WARN_INT_CONVERSION = YES; 516 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 517 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 518 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 519 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 520 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 521 | CLANG_WARN_STRICT_PROTOTYPES = YES; 522 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 523 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 524 | CLANG_WARN_UNREACHABLE_CODE = YES; 525 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 526 | CODE_SIGN_IDENTITY = "iPhone Developer"; 527 | COPY_PHASE_STRIP = NO; 528 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 529 | ENABLE_NS_ASSERTIONS = NO; 530 | ENABLE_STRICT_OBJC_MSGSEND = YES; 531 | GCC_C_LANGUAGE_STANDARD = gnu11; 532 | GCC_NO_COMMON_BLOCKS = YES; 533 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 534 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 535 | GCC_WARN_UNDECLARED_SELECTOR = YES; 536 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 537 | GCC_WARN_UNUSED_FUNCTION = YES; 538 | GCC_WARN_UNUSED_VARIABLE = YES; 539 | IPHONEOS_DEPLOYMENT_TARGET = 12.2; 540 | MTL_ENABLE_DEBUG_INFO = NO; 541 | MTL_FAST_MATH = YES; 542 | SDKROOT = iphoneos; 543 | VALIDATE_PRODUCT = YES; 544 | }; 545 | name = Release; 546 | }; 547 | 036148642293C65F0093D9F1 /* Debug */ = { 548 | isa = XCBuildConfiguration; 549 | buildSettings = { 550 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 551 | CODE_SIGN_STYLE = Automatic; 552 | DEVELOPMENT_TEAM = HWZH7TV284; 553 | INFOPLIST_FILE = ZSSnapshotKit_master/Info.plist; 554 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 555 | LD_RUNPATH_SEARCH_PATHS = ( 556 | "$(inherited)", 557 | "@executable_path/Frameworks", 558 | ); 559 | PRODUCT_BUNDLE_IDENTIFIER = "com.safiri.ZSSnapshotKit-master"; 560 | PRODUCT_NAME = "$(TARGET_NAME)"; 561 | TARGETED_DEVICE_FAMILY = "1,2"; 562 | }; 563 | name = Debug; 564 | }; 565 | 036148652293C65F0093D9F1 /* Release */ = { 566 | isa = XCBuildConfiguration; 567 | buildSettings = { 568 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 569 | CODE_SIGN_STYLE = Automatic; 570 | DEVELOPMENT_TEAM = HWZH7TV284; 571 | INFOPLIST_FILE = ZSSnapshotKit_master/Info.plist; 572 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 573 | LD_RUNPATH_SEARCH_PATHS = ( 574 | "$(inherited)", 575 | "@executable_path/Frameworks", 576 | ); 577 | PRODUCT_BUNDLE_IDENTIFIER = "com.safiri.ZSSnapshotKit-master"; 578 | PRODUCT_NAME = "$(TARGET_NAME)"; 579 | TARGETED_DEVICE_FAMILY = "1,2"; 580 | }; 581 | name = Release; 582 | }; 583 | /* End XCBuildConfiguration section */ 584 | 585 | /* Begin XCConfigurationList section */ 586 | 036148482293C65D0093D9F1 /* Build configuration list for PBXProject "ZSSnapshotKit_master" */ = { 587 | isa = XCConfigurationList; 588 | buildConfigurations = ( 589 | 036148612293C65F0093D9F1 /* Debug */, 590 | 036148622293C65F0093D9F1 /* Release */, 591 | ); 592 | defaultConfigurationIsVisible = 0; 593 | defaultConfigurationName = Release; 594 | }; 595 | 036148632293C65F0093D9F1 /* Build configuration list for PBXNativeTarget "ZSSnapshotKit_master" */ = { 596 | isa = XCConfigurationList; 597 | buildConfigurations = ( 598 | 036148642293C65F0093D9F1 /* Debug */, 599 | 036148652293C65F0093D9F1 /* Release */, 600 | ); 601 | defaultConfigurationIsVisible = 0; 602 | defaultConfigurationName = Release; 603 | }; 604 | /* End XCConfigurationList section */ 605 | }; 606 | rootObject = 036148452293C65D0093D9F1 /* Project object */; 607 | } 608 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master.xcodeproj/project.xcworkspace/xcuserdata/safiri.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master.xcodeproj/project.xcworkspace/xcuserdata/safiri.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master.xcodeproj/xcuserdata/safiri.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master.xcodeproj/xcuserdata/safiri.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | ZSSnapshotKit_master.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // ZSSnapshotKit_master 4 | // 5 | // Created by safiri on 2019/5/21. 6 | // Copyright © 2019 safiri. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // ZSSnapshotKit_master 4 | // 5 | // Created by safiri on 2019/5/21. 6 | // Copyright © 2019 safiri. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @interface AppDelegate () 12 | 13 | @end 14 | 15 | @implementation AppDelegate 16 | 17 | 18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 19 | // Override point for customization after application launch. 20 | return YES; 21 | } 22 | 23 | 24 | - (void)applicationWillResignActive:(UIApplication *)application { 25 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 26 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 27 | } 28 | 29 | 30 | - (void)applicationDidEnterBackground:(UIApplication *)application { 31 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 32 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 33 | } 34 | 35 | 36 | - (void)applicationWillEnterForeground:(UIApplication *)application { 37 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 38 | } 39 | 40 | 41 | - (void)applicationDidBecomeActive:(UIApplication *)application { 42 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 43 | } 44 | 45 | 46 | - (void)applicationWillTerminate:(UIApplication *)application { 47 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 48 | } 49 | 50 | 51 | @end 52 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | NSPhotoLibraryAddUsageDescription 45 | 需要您的同意,才能访问照片存储图片 46 | NSAppTransportSecurity 47 | 48 | NSAllowsArbitraryLoads 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2011-2018 Sam Vermette, Tobias Tiemerding and contributors. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/README.md: -------------------------------------------------------------------------------- 1 | # SVProgressHUD 2 | 3 | ![Pod Version](https://img.shields.io/cocoapods/v/SVProgressHUD.svg?style=flat) 4 | ![Pod Platform](https://img.shields.io/cocoapods/p/SVProgressHUD.svg?style=flat) 5 | ![Pod License](https://img.shields.io/cocoapods/l/SVProgressHUD.svg?style=flat) 6 | [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-green.svg?style=flat)](https://github.com/Carthage/Carthage) 7 | [![CocoaPods compatible](https://img.shields.io/badge/CocoaPods-compatible-green.svg?style=flat)](https://cocoapods.org) 8 | 9 | `SVProgressHUD` is a clean and easy-to-use HUD meant to display the progress of an ongoing task on iOS and tvOS. 10 | 11 | ![SVProgressHUD](http://f.cl.ly/items/2G1F1Z0M0k0h2U3V1p39/SVProgressHUD.gif) 12 | 13 | ## Demo 14 | 15 | Try `SVProgressHUD` on [Appetize.io](https://appetize.io/app/p8r2cvy8kq74x7q7tjqf5gyatr). 16 | 17 | ## Installation 18 | 19 | ### From CocoaPods 20 | 21 | [CocoaPods](http://cocoapods.org) is a dependency manager for Objective-C, which automates and simplifies the process of using 3rd-party libraries like `SVProgressHUD` in your projects. First, add the following line to your [Podfile](http://guides.cocoapods.org/using/using-cocoapods.html): 22 | 23 | ```ruby 24 | pod 'SVProgressHUD' 25 | ``` 26 | 27 | If you want to use the latest features of `SVProgressHUD` use normal external source dependencies. 28 | 29 | ```ruby 30 | pod 'SVProgressHUD', :git => 'https://github.com/SVProgressHUD/SVProgressHUD.git' 31 | ``` 32 | 33 | This pulls from the `master` branch directly. 34 | 35 | Second, install `SVProgressHUD` into your project: 36 | 37 | ```ruby 38 | pod install 39 | ``` 40 | 41 | ### Carthage 42 | 43 | [Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. To integrate `SVProgressHUD` into your Xcode project using Carthage, specify it in your `Cartfile`: 44 | 45 | ```ogdl 46 | github "SVProgressHUD/SVProgressHUD" 47 | ``` 48 | 49 | Run `carthage bootstrap` to build the framework in your repository's Carthage directory. You can then include it in your target's `carthage copy-frameworks` build phase. For more information on this, please see [Carthage's documentation](https://github.com/carthage/carthage#if-youre-building-for-ios-tvos-or-watchos). 50 | 51 | ### Manually 52 | 53 | * Drag the `SVProgressHUD/SVProgressHUD` folder into your project. 54 | * Take care that `SVProgressHUD.bundle` is added to `Targets->Build Phases->Copy Bundle Resources`. 55 | * Add the **QuartzCore** framework to your project. 56 | 57 | ## Swift 58 | 59 | Even though `SVProgressHUD` is written in Objective-C, it can be used in Swift with no hassle. If you use [CocoaPods](http://cocoapods.org) add the following line to your [Podfile](http://guides.cocoapods.org/using/using-cocoapods.html): 60 | 61 | ```ruby 62 | use_frameworks! 63 | ``` 64 | 65 | If you added `SVProgressHUD` manually, just add a [bridging header](https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html) file to your project with the `SVProgressHUD` header included. 66 | 67 | ## Usage 68 | 69 | (see sample Xcode project in `/Demo`) 70 | 71 | `SVProgressHUD` is created as a singleton (i.e. it doesn't need to be explicitly allocated and instantiated; you directly call `[SVProgressHUD method]`). 72 | 73 | **Use `SVProgressHUD` wisely! Only use it if you absolutely need to perform a task before taking the user forward. Bad use case examples: pull to refresh, infinite scrolling, sending message.** 74 | 75 | Using `SVProgressHUD` in your app will usually look as simple as this (using Grand Central Dispatch): 76 | 77 | ```objective-c 78 | [SVProgressHUD show]; 79 | dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 80 | // time-consuming task 81 | dispatch_async(dispatch_get_main_queue(), ^{ 82 | [SVProgressHUD dismiss]; 83 | }); 84 | }); 85 | ``` 86 | 87 | ### Showing the HUD 88 | 89 | You can show the status of indeterminate tasks using one of the following: 90 | 91 | ```objective-c 92 | + (void)show; 93 | + (void)showWithStatus:(NSString*)string; 94 | ``` 95 | 96 | If you'd like the HUD to reflect the progress of a task, use one of these: 97 | 98 | ```objective-c 99 | + (void)showProgress:(CGFloat)progress; 100 | + (void)showProgress:(CGFloat)progress status:(NSString*)status; 101 | ``` 102 | 103 | ### Dismissing the HUD 104 | 105 | The HUD can be dismissed using: 106 | 107 | ```objective-c 108 | + (void)dismiss; 109 | + (void)dismissWithDelay:(NSTimeInterval)delay; 110 | ``` 111 | 112 | If you'd like to stack HUDs, you can balance out every show call using: 113 | 114 | ``` 115 | + (void)popActivity; 116 | ``` 117 | 118 | The HUD will get dismissed once the popActivity calls will match the number of show calls. 119 | 120 | Or show a confirmation glyph before before getting dismissed a little bit later. The display time depends on `minimumDismissTimeInterval` and the length of the given string. 121 | 122 | ```objective-c 123 | + (void)showInfoWithStatus:(NSString*)string; 124 | + (void)showSuccessWithStatus:(NSString*)string; 125 | + (void)showErrorWithStatus:(NSString*)string; 126 | + (void)showImage:(UIImage*)image status:(NSString*)string; 127 | ``` 128 | 129 | ## Customization 130 | 131 | `SVProgressHUD` can be customized via the following methods: 132 | 133 | ```objective-c 134 | + (void)setDefaultStyle:(SVProgressHUDStyle)style; // default is SVProgressHUDStyleLight 135 | + (void)setDefaultMaskType:(SVProgressHUDMaskType)maskType; // default is SVProgressHUDMaskTypeNone 136 | + (void)setDefaultAnimationType:(SVProgressHUDAnimationType)type; // default is SVProgressHUDAnimationTypeFlat 137 | + (void)setContainerView:(UIView*)containerView; // default is window level 138 | + (void)setMinimumSize:(CGSize)minimumSize; // default is CGSizeZero, can be used to avoid resizing 139 | + (void)setRingThickness:(CGFloat)width; // default is 2 pt 140 | + (void)setRingRadius:(CGFloat)radius; // default is 18 pt 141 | + (void)setRingNoTextRadius:(CGFloat)radius; // default is 24 pt 142 | + (void)setCornerRadius:(CGFloat)cornerRadius; // default is 14 pt 143 | + (void)setBorderColor:(nonnull UIColor*)color; // default is nil 144 | + (void)setBorderWidth:(CGFloat)width; // default is 0 145 | + (void)setFont:(UIFont*)font; // default is [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline] 146 | + (void)setForegroundColor:(UIColor*)color; // default is [UIColor blackColor], only used for SVProgressHUDStyleCustom 147 | + (void)setBackgroundColor:(UIColor*)color; // default is [UIColor whiteColor], only used for SVProgressHUDStyleCustom 148 | + (void)setBackgroundLayerColor:(UIColor*)color; // default is [UIColor colorWithWhite:0 alpha:0.4], only used for SVProgressHUDMaskTypeCustom 149 | + (void)setImageViewSize:(CGSize)size; // default is 28x28 pt 150 | + (void)setShouldTintImages:(BOOL)shouldTintImages; // default is YES 151 | + (void)setInfoImage:(UIImage*)image; // default is the bundled info image provided by Freepik 152 | + (void)setSuccessImage:(UIImage*)image; // default is bundled success image from Freepik 153 | + (void)setErrorImage:(UIImage*)image; // default is bundled error image from Freepik 154 | + (void)setViewForExtension:(UIView*)view; // default is nil, only used if #define SV_APP_EXTENSIONS is set 155 | + (void)setGraceTimeInterval:(NSTimeInterval)interval; // default is 0 seconds 156 | + (void)setMinimumDismissTimeInterval:(NSTimeInterval)interval; // default is 5.0 seconds 157 | + (void)setMaximumDismissTimeInterval:(NSTimeInterval)interval; // default is CGFLOAT_MAX 158 | + (void)setFadeInAnimationDuration:(NSTimeInterval)duration; // default is 0.15 seconds 159 | + (void)setFadeOutAnimationDuration:(NSTimeInterval)duration; // default is 0.15 seconds 160 | + (void)setMaxSupportedWindowLevel:(UIWindowLevel)windowLevel; // default is UIWindowLevelNormal 161 | + (void)setHapticsEnabled:(BOOL)hapticsEnabled; // default is NO 162 | ``` 163 | 164 | Additionally `SVProgressHUD` supports the `UIAppearance` protocol for most of the above methods. 165 | 166 | ### Hint 167 | 168 | As standard `SVProgressHUD` offers two preconfigured styles: 169 | 170 | * `SVProgressHUDStyleLight`: White background with black spinner and text 171 | * `SVProgressHUDStyleDark`: Black background with white spinner and text 172 | 173 | If you want to use custom colors use `setForegroundColor` and `setBackgroundColor:`. These implicitly set the HUD's style to `SVProgressHUDStyleCustom`. 174 | 175 | ## Haptic Feedback 176 | 177 | For users with newer devices (starting with the iPhone 7), `SVProgressHUD` can automatically trigger haptic feedback depending on which HUD is being displayed. The feedback maps as follows: 178 | 179 | * `showSuccessWithStatus:` <-> `UINotificationFeedbackTypeSuccess` 180 | * `showInfoWithStatus:` <-> `UINotificationFeedbackTypeWarning` 181 | * `showErrorWithStatus:` <-> `UINotificationFeedbackTypeError` 182 | 183 | To enable this functionality, use `setHapticsEnabled:`. 184 | 185 | Users with devices prior to iPhone 7 will have no change in functionality. 186 | 187 | ## Notifications 188 | 189 | `SVProgressHUD` posts four notifications via `NSNotificationCenter` in response to being shown/dismissed: 190 | * `SVProgressHUDWillAppearNotification` when the show animation starts 191 | * `SVProgressHUDDidAppearNotification` when the show animation completes 192 | * `SVProgressHUDWillDisappearNotification` when the dismiss animation starts 193 | * `SVProgressHUDDidDisappearNotification` when the dismiss animation completes 194 | 195 | Each notification passes a `userInfo` dictionary holding the HUD's status string (if any), retrievable via `SVProgressHUDStatusUserInfoKey`. 196 | 197 | `SVProgressHUD` also posts `SVProgressHUDDidReceiveTouchEventNotification` when users touch on the overall screen or `SVProgressHUDDidTouchDownInsideNotification` when a user touches on the HUD directly. For this notifications `userInfo` is not passed but the object parameter contains the `UIEvent` that related to the touch. 198 | 199 | ## App Extensions 200 | 201 | When using `SVProgressHUD` in an App Extension, `#define SV_APP_EXTENSIONS` to avoid using unavailable APIs. Additionally call `setViewForExtension:` from your extensions view controller with `self.view`. 202 | 203 | ## Contributing to this project 204 | 205 | If you have feature requests or bug reports, feel free to help out by sending pull requests or by [creating new issues](https://github.com/SVProgressHUD/SVProgressHUD/issues/new). Please take a moment to 206 | review the guidelines written by [Nicolas Gallagher](https://github.com/necolas): 207 | 208 | * [Bug reports](https://github.com/necolas/issue-guidelines/blob/master/CONTRIBUTING.md#bugs) 209 | * [Feature requests](https://github.com/necolas/issue-guidelines/blob/master/CONTRIBUTING.md#features) 210 | * [Pull requests](https://github.com/necolas/issue-guidelines/blob/master/CONTRIBUTING.md#pull-requests) 211 | 212 | ## License 213 | 214 | `SVProgressHUD` is distributed under the terms and conditions of the [MIT license](https://github.com/SVProgressHUD/SVProgressHUD/blob/master/LICENSE.txt). The success, error and info icons are made by [Freepik](http://www.freepik.com) from [Flaticon](http://www.flaticon.com) and are licensed under [Creative Commons BY 3.0](http://creativecommons.org/licenses/by/3.0/). 215 | 216 | ## Credits 217 | 218 | `SVProgressHUD` is brought to you by [Sam Vermette](http://samvermette.com), [Tobias Tiemerding](http://tiemerding.com) and [contributors to the project](https://github.com/SVProgressHUD/SVProgressHUD/contributors). If you're using `SVProgressHUD` in your project, attribution would be very appreciated. 219 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.h: -------------------------------------------------------------------------------- 1 | // 2 | // SVIndefiniteAnimatedView.h 3 | // SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD 4 | // 5 | // Copyright (c) 2014-2018 Guillaume Campagna. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | @interface SVIndefiniteAnimatedView : UIView 11 | 12 | @property (nonatomic, assign) CGFloat strokeThickness; 13 | @property (nonatomic, assign) CGFloat radius; 14 | @property (nonatomic, strong) UIColor *strokeColor; 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.m: -------------------------------------------------------------------------------- 1 | // 2 | // SVIndefiniteAnimatedView.m 3 | // SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD 4 | // 5 | // Copyright (c) 2014-2018 Guillaume Campagna. All rights reserved. 6 | // 7 | 8 | #import "SVIndefiniteAnimatedView.h" 9 | #import "SVProgressHUD.h" 10 | 11 | @interface SVIndefiniteAnimatedView () 12 | 13 | @property (nonatomic, strong) CAShapeLayer *indefiniteAnimatedLayer; 14 | 15 | @end 16 | 17 | @implementation SVIndefiniteAnimatedView 18 | 19 | - (void)willMoveToSuperview:(UIView*)newSuperview { 20 | if (newSuperview) { 21 | [self layoutAnimatedLayer]; 22 | } else { 23 | [_indefiniteAnimatedLayer removeFromSuperlayer]; 24 | _indefiniteAnimatedLayer = nil; 25 | } 26 | } 27 | 28 | - (void)layoutAnimatedLayer { 29 | CALayer *layer = self.indefiniteAnimatedLayer; 30 | [self.layer addSublayer:layer]; 31 | 32 | CGFloat widthDiff = CGRectGetWidth(self.bounds) - CGRectGetWidth(layer.bounds); 33 | CGFloat heightDiff = CGRectGetHeight(self.bounds) - CGRectGetHeight(layer.bounds); 34 | layer.position = CGPointMake(CGRectGetWidth(self.bounds) - CGRectGetWidth(layer.bounds) / 2 - widthDiff / 2, CGRectGetHeight(self.bounds) - CGRectGetHeight(layer.bounds) / 2 - heightDiff / 2); 35 | } 36 | 37 | - (CAShapeLayer*)indefiniteAnimatedLayer { 38 | if(!_indefiniteAnimatedLayer) { 39 | CGPoint arcCenter = CGPointMake(self.radius+self.strokeThickness/2+5, self.radius+self.strokeThickness/2+5); 40 | UIBezierPath* smoothedPath = [UIBezierPath bezierPathWithArcCenter:arcCenter radius:self.radius startAngle:(CGFloat) (M_PI*3/2) endAngle:(CGFloat) (M_PI/2+M_PI*5) clockwise:YES]; 41 | 42 | _indefiniteAnimatedLayer = [CAShapeLayer layer]; 43 | _indefiniteAnimatedLayer.contentsScale = [[UIScreen mainScreen] scale]; 44 | _indefiniteAnimatedLayer.frame = CGRectMake(0.0f, 0.0f, arcCenter.x*2, arcCenter.y*2); 45 | _indefiniteAnimatedLayer.fillColor = [UIColor clearColor].CGColor; 46 | _indefiniteAnimatedLayer.strokeColor = self.strokeColor.CGColor; 47 | _indefiniteAnimatedLayer.lineWidth = self.strokeThickness; 48 | _indefiniteAnimatedLayer.lineCap = kCALineCapRound; 49 | _indefiniteAnimatedLayer.lineJoin = kCALineJoinBevel; 50 | _indefiniteAnimatedLayer.path = smoothedPath.CGPath; 51 | 52 | CALayer *maskLayer = [CALayer layer]; 53 | 54 | NSBundle *bundle = [NSBundle bundleForClass:[SVProgressHUD class]]; 55 | NSURL *url = [bundle URLForResource:@"SVProgressHUD" withExtension:@"bundle"]; 56 | NSBundle *imageBundle = [NSBundle bundleWithURL:url]; 57 | 58 | NSString *path = [imageBundle pathForResource:@"angle-mask" ofType:@"png"]; 59 | 60 | maskLayer.contents = (__bridge id)[[UIImage imageWithContentsOfFile:path] CGImage]; 61 | maskLayer.frame = _indefiniteAnimatedLayer.bounds; 62 | _indefiniteAnimatedLayer.mask = maskLayer; 63 | 64 | NSTimeInterval animationDuration = 1; 65 | CAMediaTimingFunction *linearCurve = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 66 | 67 | CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; 68 | animation.fromValue = (id) 0; 69 | animation.toValue = @(M_PI*2); 70 | animation.duration = animationDuration; 71 | animation.timingFunction = linearCurve; 72 | animation.removedOnCompletion = NO; 73 | animation.repeatCount = INFINITY; 74 | animation.fillMode = kCAFillModeForwards; 75 | animation.autoreverses = NO; 76 | [_indefiniteAnimatedLayer.mask addAnimation:animation forKey:@"rotate"]; 77 | 78 | CAAnimationGroup *animationGroup = [CAAnimationGroup animation]; 79 | animationGroup.duration = animationDuration; 80 | animationGroup.repeatCount = INFINITY; 81 | animationGroup.removedOnCompletion = NO; 82 | animationGroup.timingFunction = linearCurve; 83 | 84 | CABasicAnimation *strokeStartAnimation = [CABasicAnimation animationWithKeyPath:@"strokeStart"]; 85 | strokeStartAnimation.fromValue = @0.015; 86 | strokeStartAnimation.toValue = @0.515; 87 | 88 | CABasicAnimation *strokeEndAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; 89 | strokeEndAnimation.fromValue = @0.485; 90 | strokeEndAnimation.toValue = @0.985; 91 | 92 | animationGroup.animations = @[strokeStartAnimation, strokeEndAnimation]; 93 | [_indefiniteAnimatedLayer addAnimation:animationGroup forKey:@"progress"]; 94 | 95 | } 96 | return _indefiniteAnimatedLayer; 97 | } 98 | 99 | - (void)setFrame:(CGRect)frame { 100 | if(!CGRectEqualToRect(frame, super.frame)) { 101 | [super setFrame:frame]; 102 | 103 | if(self.superview) { 104 | [self layoutAnimatedLayer]; 105 | } 106 | } 107 | 108 | } 109 | 110 | - (void)setRadius:(CGFloat)radius { 111 | if(radius != _radius) { 112 | _radius = radius; 113 | 114 | [_indefiniteAnimatedLayer removeFromSuperlayer]; 115 | _indefiniteAnimatedLayer = nil; 116 | 117 | if(self.superview) { 118 | [self layoutAnimatedLayer]; 119 | } 120 | } 121 | } 122 | 123 | - (void)setStrokeColor:(UIColor*)strokeColor { 124 | _strokeColor = strokeColor; 125 | _indefiniteAnimatedLayer.strokeColor = strokeColor.CGColor; 126 | } 127 | 128 | - (void)setStrokeThickness:(CGFloat)strokeThickness { 129 | _strokeThickness = strokeThickness; 130 | _indefiniteAnimatedLayer.lineWidth = _strokeThickness; 131 | } 132 | 133 | - (CGSize)sizeThatFits:(CGSize)size { 134 | return CGSizeMake((self.radius+self.strokeThickness/2+5)*2, (self.radius+self.strokeThickness/2+5)*2); 135 | } 136 | 137 | @end 138 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressAnimatedView.h: -------------------------------------------------------------------------------- 1 | // 2 | // SVProgressAnimatedView.h 3 | // SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD 4 | // 5 | // Copyright (c) 2017-2018 Tobias Tiemerding. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | @interface SVProgressAnimatedView : UIView 11 | 12 | @property (nonatomic, assign) CGFloat radius; 13 | @property (nonatomic, assign) CGFloat strokeThickness; 14 | @property (nonatomic, strong) UIColor *strokeColor; 15 | @property (nonatomic, assign) CGFloat strokeEnd; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressAnimatedView.m: -------------------------------------------------------------------------------- 1 | // 2 | // SVProgressAnimatedView.m 3 | // SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD 4 | // 5 | // Copyright (c) 2017-2018 Tobias Tiemerding. All rights reserved. 6 | // 7 | 8 | #import "SVProgressAnimatedView.h" 9 | 10 | @interface SVProgressAnimatedView () 11 | 12 | @property (nonatomic, strong) CAShapeLayer *ringAnimatedLayer; 13 | 14 | @end 15 | 16 | @implementation SVProgressAnimatedView 17 | 18 | - (void)willMoveToSuperview:(UIView*)newSuperview { 19 | if (newSuperview) { 20 | [self layoutAnimatedLayer]; 21 | } else { 22 | [_ringAnimatedLayer removeFromSuperlayer]; 23 | _ringAnimatedLayer = nil; 24 | } 25 | } 26 | 27 | - (void)layoutAnimatedLayer { 28 | CALayer *layer = self.ringAnimatedLayer; 29 | [self.layer addSublayer:layer]; 30 | 31 | CGFloat widthDiff = CGRectGetWidth(self.bounds) - CGRectGetWidth(layer.bounds); 32 | CGFloat heightDiff = CGRectGetHeight(self.bounds) - CGRectGetHeight(layer.bounds); 33 | layer.position = CGPointMake(CGRectGetWidth(self.bounds) - CGRectGetWidth(layer.bounds) / 2 - widthDiff / 2, CGRectGetHeight(self.bounds) - CGRectGetHeight(layer.bounds) / 2 - heightDiff / 2); 34 | } 35 | 36 | - (CAShapeLayer*)ringAnimatedLayer { 37 | if(!_ringAnimatedLayer) { 38 | CGPoint arcCenter = CGPointMake(self.radius+self.strokeThickness/2+5, self.radius+self.strokeThickness/2+5); 39 | UIBezierPath* smoothedPath = [UIBezierPath bezierPathWithArcCenter:arcCenter radius:self.radius startAngle:(CGFloat)-M_PI_2 endAngle:(CGFloat) (M_PI + M_PI_2) clockwise:YES]; 40 | 41 | _ringAnimatedLayer = [CAShapeLayer layer]; 42 | _ringAnimatedLayer.contentsScale = [[UIScreen mainScreen] scale]; 43 | _ringAnimatedLayer.frame = CGRectMake(0.0f, 0.0f, arcCenter.x*2, arcCenter.y*2); 44 | _ringAnimatedLayer.fillColor = [UIColor clearColor].CGColor; 45 | _ringAnimatedLayer.strokeColor = self.strokeColor.CGColor; 46 | _ringAnimatedLayer.lineWidth = self.strokeThickness; 47 | _ringAnimatedLayer.lineCap = kCALineCapRound; 48 | _ringAnimatedLayer.lineJoin = kCALineJoinBevel; 49 | _ringAnimatedLayer.path = smoothedPath.CGPath; 50 | } 51 | return _ringAnimatedLayer; 52 | } 53 | 54 | - (void)setFrame:(CGRect)frame { 55 | if(!CGRectEqualToRect(frame, super.frame)) { 56 | [super setFrame:frame]; 57 | 58 | if(self.superview) { 59 | [self layoutAnimatedLayer]; 60 | } 61 | } 62 | } 63 | 64 | - (void)setRadius:(CGFloat)radius { 65 | if(radius != _radius) { 66 | _radius = radius; 67 | 68 | [_ringAnimatedLayer removeFromSuperlayer]; 69 | _ringAnimatedLayer = nil; 70 | 71 | if(self.superview) { 72 | [self layoutAnimatedLayer]; 73 | } 74 | } 75 | } 76 | 77 | - (void)setStrokeColor:(UIColor*)strokeColor { 78 | _strokeColor = strokeColor; 79 | _ringAnimatedLayer.strokeColor = strokeColor.CGColor; 80 | } 81 | 82 | - (void)setStrokeThickness:(CGFloat)strokeThickness { 83 | _strokeThickness = strokeThickness; 84 | _ringAnimatedLayer.lineWidth = _strokeThickness; 85 | } 86 | 87 | - (void)setStrokeEnd:(CGFloat)strokeEnd { 88 | _strokeEnd = strokeEnd; 89 | _ringAnimatedLayer.strokeEnd = _strokeEnd; 90 | } 91 | 92 | - (CGSize)sizeThatFits:(CGSize)size { 93 | return CGSizeMake((self.radius+self.strokeThickness/2+5)*2, (self.radius+self.strokeThickness/2+5)*2); 94 | } 95 | 96 | @end 97 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@2x.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@3x.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@2x.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@3x.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@2x.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@3x.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@2x.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@3x.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVProgressHUD.h: -------------------------------------------------------------------------------- 1 | // 2 | // SVProgressHUD.h 3 | // SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD 4 | // 5 | // Copyright (c) 2011-2018 Sam Vermette and contributors. All rights reserved. 6 | // 7 | 8 | #import 9 | #import 10 | 11 | extern NSString * _Nonnull const SVProgressHUDDidReceiveTouchEventNotification; 12 | extern NSString * _Nonnull const SVProgressHUDDidTouchDownInsideNotification; 13 | extern NSString * _Nonnull const SVProgressHUDWillDisappearNotification; 14 | extern NSString * _Nonnull const SVProgressHUDDidDisappearNotification; 15 | extern NSString * _Nonnull const SVProgressHUDWillAppearNotification; 16 | extern NSString * _Nonnull const SVProgressHUDDidAppearNotification; 17 | 18 | extern NSString * _Nonnull const SVProgressHUDStatusUserInfoKey; 19 | 20 | typedef NS_ENUM(NSInteger, SVProgressHUDStyle) { 21 | SVProgressHUDStyleLight, // default style, white HUD with black text, HUD background will be blurred 22 | SVProgressHUDStyleDark, // black HUD and white text, HUD background will be blurred 23 | SVProgressHUDStyleCustom // uses the fore- and background color properties 24 | }; 25 | 26 | typedef NS_ENUM(NSUInteger, SVProgressHUDMaskType) { 27 | SVProgressHUDMaskTypeNone = 1, // default mask type, allow user interactions while HUD is displayed 28 | SVProgressHUDMaskTypeClear, // don't allow user interactions with background objects 29 | SVProgressHUDMaskTypeBlack, // don't allow user interactions with background objects and dim the UI in the back of the HUD (as seen in iOS 7 and above) 30 | SVProgressHUDMaskTypeGradient, // don't allow user interactions with background objects and dim the UI with a a-la UIAlertView background gradient (as seen in iOS 6) 31 | SVProgressHUDMaskTypeCustom // don't allow user interactions with background objects and dim the UI in the back of the HUD with a custom color 32 | }; 33 | 34 | typedef NS_ENUM(NSUInteger, SVProgressHUDAnimationType) { 35 | SVProgressHUDAnimationTypeFlat, // default animation type, custom flat animation (indefinite animated ring) 36 | SVProgressHUDAnimationTypeNative // iOS native UIActivityIndicatorView 37 | }; 38 | 39 | typedef void (^SVProgressHUDShowCompletion)(void); 40 | typedef void (^SVProgressHUDDismissCompletion)(void); 41 | 42 | @interface SVProgressHUD : UIView 43 | 44 | #pragma mark - Customization 45 | 46 | @property (assign, nonatomic) SVProgressHUDStyle defaultStyle UI_APPEARANCE_SELECTOR; // default is SVProgressHUDStyleLight 47 | @property (assign, nonatomic) SVProgressHUDMaskType defaultMaskType UI_APPEARANCE_SELECTOR; // default is SVProgressHUDMaskTypeNone 48 | @property (assign, nonatomic) SVProgressHUDAnimationType defaultAnimationType UI_APPEARANCE_SELECTOR; // default is SVProgressHUDAnimationTypeFlat 49 | @property (strong, nonatomic, nullable) UIView *containerView; // if nil then use default window level 50 | @property (assign, nonatomic) CGSize minimumSize UI_APPEARANCE_SELECTOR; // default is CGSizeZero, can be used to avoid resizing for a larger message 51 | @property (assign, nonatomic) CGFloat ringThickness UI_APPEARANCE_SELECTOR; // default is 2 pt 52 | @property (assign, nonatomic) CGFloat ringRadius UI_APPEARANCE_SELECTOR; // default is 18 pt 53 | @property (assign, nonatomic) CGFloat ringNoTextRadius UI_APPEARANCE_SELECTOR; // default is 24 pt 54 | @property (assign, nonatomic) CGFloat cornerRadius UI_APPEARANCE_SELECTOR; // default is 14 pt 55 | @property (strong, nonatomic, nonnull) UIFont *font UI_APPEARANCE_SELECTOR; // default is [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline] 56 | @property (strong, nonatomic, nonnull) UIColor *backgroundColor UI_APPEARANCE_SELECTOR; // default is [UIColor whiteColor] 57 | @property (strong, nonatomic, nonnull) UIColor *foregroundColor UI_APPEARANCE_SELECTOR; // default is [UIColor blackColor] 58 | @property (strong, nonatomic, nonnull) UIColor *backgroundLayerColor UI_APPEARANCE_SELECTOR;// default is [UIColor colorWithWhite:0 alpha:0.4] 59 | @property (assign, nonatomic) CGSize imageViewSize UI_APPEARANCE_SELECTOR; // default is 28x28 pt 60 | @property (assign, nonatomic) BOOL shouldTintImages UI_APPEARANCE_SELECTOR; // default is YES 61 | @property (strong, nonatomic, nonnull) UIImage *infoImage UI_APPEARANCE_SELECTOR; // default is the bundled info image provided by Freepik 62 | @property (strong, nonatomic, nonnull) UIImage *successImage UI_APPEARANCE_SELECTOR; // default is the bundled success image provided by Freepik 63 | @property (strong, nonatomic, nonnull) UIImage *errorImage UI_APPEARANCE_SELECTOR; // default is the bundled error image provided by Freepik 64 | @property (strong, nonatomic, nonnull) UIView *viewForExtension UI_APPEARANCE_SELECTOR; // default is nil, only used if #define SV_APP_EXTENSIONS is set 65 | @property (assign, nonatomic) NSTimeInterval graceTimeInterval; // default is 0 seconds 66 | @property (assign, nonatomic) NSTimeInterval minimumDismissTimeInterval; // default is 5.0 seconds 67 | @property (assign, nonatomic) NSTimeInterval maximumDismissTimeInterval; // default is CGFLOAT_MAX 68 | 69 | @property (assign, nonatomic) UIOffset offsetFromCenter UI_APPEARANCE_SELECTOR; // default is 0, 0 70 | 71 | @property (assign, nonatomic) NSTimeInterval fadeInAnimationDuration UI_APPEARANCE_SELECTOR; // default is 0.15 72 | @property (assign, nonatomic) NSTimeInterval fadeOutAnimationDuration UI_APPEARANCE_SELECTOR; // default is 0.15 73 | 74 | @property (assign, nonatomic) UIWindowLevel maxSupportedWindowLevel; // default is UIWindowLevelNormal 75 | 76 | @property (assign, nonatomic) BOOL hapticsEnabled; // default is NO 77 | 78 | + (void)setDefaultStyle:(SVProgressHUDStyle)style; // default is SVProgressHUDStyleLight 79 | + (void)setDefaultMaskType:(SVProgressHUDMaskType)maskType; // default is SVProgressHUDMaskTypeNone 80 | + (void)setDefaultAnimationType:(SVProgressHUDAnimationType)type; // default is SVProgressHUDAnimationTypeFlat 81 | + (void)setContainerView:(nullable UIView*)containerView; // default is window level 82 | + (void)setMinimumSize:(CGSize)minimumSize; // default is CGSizeZero, can be used to avoid resizing for a larger message 83 | + (void)setRingThickness:(CGFloat)ringThickness; // default is 2 pt 84 | + (void)setRingRadius:(CGFloat)radius; // default is 18 pt 85 | + (void)setRingNoTextRadius:(CGFloat)radius; // default is 24 pt 86 | + (void)setCornerRadius:(CGFloat)cornerRadius; // default is 14 pt 87 | + (void)setBorderColor:(nonnull UIColor*)color; // default is nil 88 | + (void)setBorderWidth:(CGFloat)width; // default is 0 89 | + (void)setFont:(nonnull UIFont*)font; // default is [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline] 90 | + (void)setForegroundColor:(nonnull UIColor*)color; // default is [UIColor blackColor], only used for SVProgressHUDStyleCustom 91 | + (void)setBackgroundColor:(nonnull UIColor*)color; // default is [UIColor whiteColor], only used for SVProgressHUDStyleCustom 92 | + (void)setBackgroundLayerColor:(nonnull UIColor*)color; // default is [UIColor colorWithWhite:0 alpha:0.5], only used for SVProgressHUDMaskTypeCustom 93 | + (void)setImageViewSize:(CGSize)size; // default is 28x28 pt 94 | + (void)setShouldTintImages:(BOOL)shouldTintImages; // default is YES 95 | + (void)setInfoImage:(nonnull UIImage*)image; // default is the bundled info image provided by Freepik 96 | + (void)setSuccessImage:(nonnull UIImage*)image; // default is the bundled success image provided by Freepik 97 | + (void)setErrorImage:(nonnull UIImage*)image; // default is the bundled error image provided by Freepik 98 | + (void)setViewForExtension:(nonnull UIView*)view; // default is nil, only used if #define SV_APP_EXTENSIONS is set 99 | + (void)setGraceTimeInterval:(NSTimeInterval)interval; // default is 0 seconds 100 | + (void)setMinimumDismissTimeInterval:(NSTimeInterval)interval; // default is 5.0 seconds 101 | + (void)setMaximumDismissTimeInterval:(NSTimeInterval)interval; // default is infinite 102 | + (void)setFadeInAnimationDuration:(NSTimeInterval)duration; // default is 0.15 seconds 103 | + (void)setFadeOutAnimationDuration:(NSTimeInterval)duration; // default is 0.15 seconds 104 | + (void)setMaxSupportedWindowLevel:(UIWindowLevel)windowLevel; // default is UIWindowLevelNormal 105 | + (void)setHapticsEnabled:(BOOL)hapticsEnabled; // default is NO 106 | 107 | #pragma mark - Show Methods 108 | 109 | + (void)show; 110 | + (void)showWithMaskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use show and setDefaultMaskType: instead."))); 111 | + (void)showWithStatus:(nullable NSString*)status; 112 | + (void)showWithStatus:(nullable NSString*)status maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showWithStatus: and setDefaultMaskType: instead."))); 113 | 114 | + (void)showProgress:(float)progress; 115 | + (void)showProgress:(float)progress maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showProgress: and setDefaultMaskType: instead."))); 116 | + (void)showProgress:(float)progress status:(nullable NSString*)status; 117 | + (void)showProgress:(float)progress status:(nullable NSString*)status maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showProgress:status: and setDefaultMaskType: instead."))); 118 | 119 | + (void)setStatus:(nullable NSString*)status; // change the HUD loading status while it's showing 120 | 121 | // stops the activity indicator, shows a glyph + status, and dismisses the HUD a little bit later 122 | + (void)showInfoWithStatus:(nullable NSString*)status; 123 | + (void)showInfoWithStatus:(nullable NSString*)status maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showInfoWithStatus: and setDefaultMaskType: instead."))); 124 | + (void)showSuccessWithStatus:(nullable NSString*)status; 125 | + (void)showSuccessWithStatus:(nullable NSString*)status maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showSuccessWithStatus: and setDefaultMaskType: instead."))); 126 | + (void)showErrorWithStatus:(nullable NSString*)status; 127 | + (void)showErrorWithStatus:(nullable NSString*)status maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showErrorWithStatus: and setDefaultMaskType: instead."))); 128 | 129 | // shows a image + status, use white PNGs with the imageViewSize (default is 28x28 pt) 130 | + (void)showImage:(nonnull UIImage*)image status:(nullable NSString*)status; 131 | + (void)showImage:(nonnull UIImage*)image status:(nullable NSString*)status maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showImage:status: and setDefaultMaskType: instead."))); 132 | 133 | + (void)setOffsetFromCenter:(UIOffset)offset; 134 | + (void)resetOffsetFromCenter; 135 | 136 | + (void)popActivity; // decrease activity count, if activity count == 0 the HUD is dismissed 137 | + (void)dismiss; 138 | + (void)dismissWithCompletion:(nullable SVProgressHUDDismissCompletion)completion; 139 | + (void)dismissWithDelay:(NSTimeInterval)delay; 140 | + (void)dismissWithDelay:(NSTimeInterval)delay completion:(nullable SVProgressHUDDismissCompletion)completion; 141 | 142 | + (BOOL)isVisible; 143 | 144 | + (NSTimeInterval)displayDurationForString:(nullable NSString*)string; 145 | 146 | @end 147 | 148 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.h: -------------------------------------------------------------------------------- 1 | // 2 | // SVRadialGradientLayer.h 3 | // SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD 4 | // 5 | // Copyright (c) 2014-2018 Tobias Tiemerding. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | @interface SVRadialGradientLayer : CALayer 11 | 12 | @property (nonatomic) CGPoint gradientCenter; 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.m: -------------------------------------------------------------------------------- 1 | // 2 | // SVRadialGradientLayer.m 3 | // SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD 4 | // 5 | // Copyright (c) 2014-2018 Tobias Tiemerding. All rights reserved. 6 | // 7 | 8 | #import "SVRadialGradientLayer.h" 9 | 10 | @implementation SVRadialGradientLayer 11 | 12 | - (void)drawInContext:(CGContextRef)context { 13 | size_t locationsCount = 2; 14 | CGFloat locations[2] = {0.0f, 1.0f}; 15 | CGFloat colors[8] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.75f}; 16 | CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 17 | CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colors, locations, locationsCount); 18 | CGColorSpaceRelease(colorSpace); 19 | 20 | float radius = MIN(self.bounds.size.width , self.bounds.size.height); 21 | CGContextDrawRadialGradient (context, gradient, self.gradientCenter, 0, self.gradientCenter, radius, kCGGradientDrawsAfterEndLocation); 22 | CGGradientRelease(gradient); 23 | } 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/dibupic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/dibupic.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/jaizaizhong.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 加载图 8 | 9 | 15 | 16 | 17 | 18 | 19 |
20 |
21 |
22 |
报告生成中...
23 | 24 |
25 | 26 |
27 | 28 | 29 | 39 | 40 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/jquery.circliful.js: -------------------------------------------------------------------------------- 1 | (function( $ ) { 2 | 3 | $.fn.circliful = function(options) { 4 | 5 | var settings = $.extend({ 6 | // These are the defaults. 7 | foregroundColor: "#556b2f", 8 | backgroundColor: "#eee", 9 | fillColor: false, 10 | width: 15, 11 | dimension:80, 12 | size: 14, 13 | percent: 50, 14 | animationStep: 1.0 15 | }, options ); 16 | return this.each(function() { 17 | var dimension = ''; 18 | var text = ''; 19 | var info = ''; 20 | var width = ''; 21 | var size = 0; 22 | var percent = 0; 23 | var endPercent = 100; 24 | var fgcolor = ''; 25 | var bgcolor = ''; 26 | var icon = ''; 27 | var animationstep = 0.0; 28 | 29 | $(this).addClass('circliful'); 30 | 31 | if($(this).data('dimension') != undefined) { 32 | dimension = $(this).data('dimension'); 33 | } else { 34 | dimension = settings.dimension; 35 | } 36 | 37 | if($(this).data('width') != undefined) { 38 | width = $(this).data('width'); 39 | } else { 40 | width = settings.width; 41 | } 42 | 43 | if($(this).data('fontsize') != undefined) { 44 | size = $(this).data('fontsize'); 45 | } else { 46 | size = settings.size; 47 | } 48 | 49 | if($(this).data('percent') != undefined) { 50 | percent = $(this).data('percent') / 100; 51 | endPercent = $(this).data('percent'); 52 | } else { 53 | percent = settings.percent / 100; 54 | } 55 | 56 | if($(this).data('fgcolor') != undefined) { 57 | fgcolor = $(this).data('fgcolor'); 58 | } else { 59 | fgcolor = settings.foregroundColor; 60 | } 61 | 62 | if($(this).data('bgcolor') != undefined) { 63 | bgcolor = $(this).data('bgcolor'); 64 | } else { 65 | bgcolor = settings.backgroundColor; 66 | } 67 | 68 | if($(this).data('animation-step') != undefined) { 69 | animationstep = parseFloat($(this).data('animation-step')); 70 | } else { 71 | animationstep = settings.animationStep; 72 | } 73 | if($(this).data('text') != undefined) { 74 | text = $(this).data('text'); 75 | 76 | if($(this).data('icon') != undefined) { 77 | icon = ''; 78 | } 79 | 80 | if($(this).data('type') != undefined) { 81 | type = $(this).data('type'); 82 | 83 | if(type == 'half') { 84 | $(this).append('' + icon + text + ''); 85 | $(this).find('.circle-text-half').css({'line-height': (dimension / 1.45) + 'px', 'font-size' : size + 'px' }); 86 | } else { 87 | $(this).append('' + icon + text + ''); 88 | $(this).find('.circle-text').css({'line-height': dimension + 'px', 'font-size' : size + 'px' }); 89 | } 90 | } else { 91 | $(this).append('' + icon + text + ''); 92 | $(this).find('.circle-text').css({'line-height': (dimension * 0.75) + 'px', 'font-size' : size + 'px' }); 93 | } 94 | } else if($(this).data('icon') != undefined) { 95 | 96 | } 97 | 98 | if($(this).data('info') != undefined) { 99 | info = $(this).data('info'); 100 | 101 | if($(this).data('type') != undefined) { 102 | type = $(this).data('type'); 103 | 104 | if(type == 'half') { 105 | $(this).append('' + info + ''); 106 | $(this).find('.circle-info-half').css({'line-height': (dimension * 0.9) + 'px','font-size': (size * 2) + 'px'}); 107 | } else { 108 | $(this).append('' + info + ''); 109 | $(this).find('.circle-info').css({'line-height': (dimension * 1.25) + 'px','font-size': (size * 2) + 'px'}); 110 | } 111 | } else { 112 | $(this).append('' + info + ''); 113 | $(this).find('.circle-info').css({'line-height': (dimension * 1.25) + 'px','font-size': (size * 2) + 'px'}); 114 | } 115 | } 116 | 117 | $(this).width(dimension + 'px'); 118 | 119 | var canvas = $('').attr({ width: dimension, height: dimension }).appendTo($(this)).get(0); 120 | var context = canvas.getContext('2d'); 121 | var x = canvas.width / 2; 122 | var y = canvas.height / 2; 123 | var degrees = percent * 360.0; 124 | var radians = degrees * (Math.PI / 180); 125 | var radius = canvas.width / 2.5; 126 | var startAngle = 2.3 * Math.PI; 127 | var endAngle = 0; 128 | var counterClockwise = false; 129 | var curPerc = animationstep === 0.0 ? endPercent : 0.0; 130 | var curStep = Math.max(animationstep, 0.0); 131 | var circ = Math.PI * 2; 132 | var quart = Math.PI / 2; 133 | var type = ''; 134 | var fill = false; 135 | 136 | if($(this).data('type') != undefined) { 137 | type = $(this).data('type'); 138 | 139 | if(type == 'half') { 140 | var startAngle = 2.0 * Math.PI; 141 | var endAngle = 3.13; 142 | var circ = Math.PI * 1.0; 143 | var quart = Math.PI / 0.996; 144 | } 145 | } 146 | 147 | if($(this).data('fill') != undefined) { 148 | fill = $(this).data('fill'); 149 | } else { 150 | fill = settings.fillColor; 151 | } 152 | //animate foreground circle 153 | function animate(current) { 154 | context.clearRect(0, 0, canvas.width, canvas.height); 155 | 156 | context.beginPath(); 157 | context.arc(x, y, radius, endAngle, startAngle, false); 158 | context.lineWidth = width - 1; 159 | 160 | // line color 161 | context.strokeStyle = bgcolor; 162 | context.stroke(); 163 | 164 | if(fill) { 165 | context.fillStyle = fill; 166 | context.fill(); 167 | } 168 | 169 | context.beginPath(); 170 | context.arc(x, y, radius, -(quart), ((circ) * current) - quart, false); 171 | context.lineWidth = width; 172 | // line color 173 | context.strokeStyle = fgcolor; 174 | context.stroke(); 175 | 176 | if (curPerc < endPercent) { 177 | curPerc += curStep; 178 | requestAnimationFrame(function () { 179 | animate(Math.min(curPerc, endPercent) / 100); 180 | }); 181 | } 182 | 183 | } 184 | 185 | animate(curPerc / 100); 186 | 187 | }); 188 | 189 | }; 190 | 191 | }( jQuery )); -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/linghongbaobanner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/linghongbaobanner.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/qiehuan-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/qiehuan-icon.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/qiehuancheliang.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 缴费易app 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 |
20 | 21 |
22 |

--我的车辆--

23 |
24 | 25 |
26 |
27 |
28 |
鲁A234432 29 |
30 |
31 |
32 |
    33 |
  • 鲁A234432
  • 34 |
  • 鲁B678432
  • 35 |
  • 鲁C678432
  • 36 |
37 |
38 |
39 | 44 |
45 |
46 | 47 |
48 | 49 |
50 | 51 | 68 | 69 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/weizhangdidian.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/weizhangdidian.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/weizhangfenxi.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 缴费易app 10 | 11 | 12 | 13 | 14 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 |
36 | 37 |
38 | 39 |
40 |
41 |
42 |
43 |
违章次数
44 |
4
45 |
46 |
47 |
罚款金额
48 |
500
49 |
50 |
51 |
扣除分数
52 |
6
53 |
54 |
55 |
56 | 57 |
58 | 2018年1月1日-2018年1月30日 59 |
60 | 61 | 62 |
63 |
64 |
65 |
66 |
67 |
违章趋势
68 |
69 |
70 |
71 |
72 | 73 | 74 | 75 | 76 |
77 |
78 |
79 |
80 |
81 |
罚款分析
82 |
83 |
84 |
总罚金:1050
85 | 86 |
87 |
88 | 89 | 90 | 91 | 92 |
93 |
94 |
95 |
96 |
97 |
违章分析
98 |
99 |
100 | 101 |
102 | 103 |
104 | 105 | 106 | 107 | 108 |
109 |
110 |
111 |
112 |
113 |
重点提醒
114 |
115 |
116 |
117 |
118 |
119 |
新洛大街颖秀路与开拓路交叉口。
120 |
违章行为:超速行驶。
121 |
122 |
123 |
124 | 125 |
违章次数
126 |
4
127 | 128 |
129 |
130 |
罚款金额
131 |
500
132 |
133 |
134 |
扣除分数
135 |
6
136 |
137 | 138 |
139 | 140 |
141 |
142 |
友情提示:请重点关注该地点。
143 |
144 |
145 | 146 | 147 | 148 | 149 |
150 |
151 |
152 |
153 |
154 |
综合评价
155 |
156 |
您本月累计超速达到13次。
157 |
158 | 159 | 分享给好友 160 | 161 |
162 |
163 | 164 |
165 | 166 | 433 | 434 | 435 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzfxstyle.css: -------------------------------------------------------------------------------- 1 | *{margin: 0; padding:0; border: none; list-style: none;text-decoration: none;font-family:"苹方 常规","苹方 中等","苹方 粗体","Microsoft YaHei UI";} 2 | html{width: 100%;overflow-x:hidden} 3 | body{width: 100%;position: relative;overflow-x:hidden} 4 | .indexbanner img{width: 100%;} 5 | .center-block {display: block; margin-right: auto; margin-left: auto;} 6 | .weizhangfenxi{background-image: linear-gradient(180deg, #435BF7, #2C72FE);padding-bottom: 10px;} 7 | .wzfx-sdf{ 8 | background-image: linear-gradient(180deg, #1F8DD1, #1976AD); 9 | border-top-left-radius:4px; 10 | border-top-right-radius:4px; 11 | padding-top:10px; 12 | } 13 | .weizhangneirongbufen{ 14 | padding: 0px 4%; 15 | text-align: center; 16 | margin-top: -24%; 17 | position: relative; 18 | } 19 | .wzfx-biaoti{ 20 | font-size: 14px; 21 | text-align:center; 22 | color: #F1ECFF; 23 | letter-spacing:1px 24 | } 25 | .wzfx-number{ 26 | font-size: 26px; 27 | text-align: center; 28 | color: #ffffff; 29 | font-weight: 800; 30 | } 31 | .wzdz-biaoti{ 32 | font-size: 13px; 33 | text-align:center; 34 | color: #999; 35 | letter-spacing:1px 36 | } 37 | .gaopinweizhang{ 38 | box-shadow: 1px 1px 6px #dce4ea; 39 | overflow: hidden; 40 | border-radius: 4px; 41 | padding-bottom: 15px; 42 | border: 1px solid #e4e9ff; 43 | } 44 | 45 | .wzdz-number{ 46 | font-size: 18px; 47 | text-align:center; 48 | color: #333; 49 | font-weight: 800; 50 | } 51 | .wzfx-time{ 52 | background-image: linear-gradient(180deg, #F2F2FF, #F2F2FF); 53 | height: 50px; 54 | border-bottom-left-radius:4px; 55 | border-bottom-right-radius:4px; 56 | font-size: 16px; 57 | line-height: 48px; 58 | letter-spacing:1.5px; 59 | color: #302758; 60 | position: relative; 61 | z-index: 1; 62 | } 63 | .weizhangtishi-timepic2{ 64 | z-index: 2; 65 | position: absolute; 66 | left:5%; 67 | top:-20px; 68 | } 69 | .weizhangtishi-timepic3{ 70 | z-index: 2; 71 | position: absolute; 72 | right:5%; 73 | top:-20px; 74 | } 75 | .weizhangtishi-timepic4{ 76 | z-index: 2; 77 | position: absolute; 78 | left:5%; 79 | top:31px; 80 | } 81 | .weizhangtishi-timepic5{ 82 | z-index: 2; 83 | position: absolute; 84 | right:5%; 85 | top:31px; 86 | } 87 | .weizhangtishi-timepic4 img{ 88 | width: 100%; 89 | /*height: 32px;*/ 90 | } 91 | .weizhangtishi-timepic5 img{ 92 | width: 100%; 93 | /*height: 32px;*/ 94 | } 95 | .weizhangtishi-timepic2 img{ 96 | width: 100%; 97 | /*height: 32px;*/ 98 | } 99 | .weizhangtishi-timepic img{ 100 | width: 100%; 101 | /*height: 32px;*/ 102 | } 103 | .weizhangtishineirongbiaoti{ 104 | width: 160px;height: 38px; 105 | border-radius:4px;border: solid 1px #8BDBE7; 106 | background-color: #3699CA;line-height: 38px;color:#ffffff;font-size: 18px; 107 | margin: 0 auto; 108 | z-index:1; 109 | } 110 | .neirongquyu{ 111 | background-color:#F8FAFF ; 112 | /*border: solid 2px #1235b3;*/ 113 | padding: 25px 10px; 114 | border-radius: 4px; 115 | margin-top: 10px; 116 | position: relative; 117 | } 118 | .neirongquyu1{ 119 | background-color:#F8FAFF ; 120 | /*border: solid 2px #1235b3;*/ 121 | padding: 25px 10px 25px 10px; 122 | border-radius: 4px; 123 | margin-top: 10px; 124 | position: relative; 125 | } 126 | .neirongquyu2{ 127 | background-color:#F8FAFF ; 128 | /*border: solid 2px #1235b3;*/ 129 | padding: 25px 20px 25px 10px; 130 | border-radius: 4px; 131 | margin-top: 10px; 132 | position: relative; 133 | } 134 | .neirongquyu img{width: 100%;height: auto;} 135 | 136 | .zhongdiantixing-con{ 137 | padding:40px 0px 30px 0px; 138 | } 139 | .zonghefenxi-con{ 140 | padding:40px 0px 0px 0px; 141 | } 142 | .tishiquyu{ 143 | text-align: center; 144 | } 145 | .fakuanzongjiner{ 146 | font-size: 14px; 147 | /*font-weight: 800;*/ 148 | color: #3a4377; 149 | margin-top: -30px; 150 | text-align: left; 151 | padding-left:3%; 152 | } 153 | .jinershuzi{ 154 | font-size: 16px; 155 | font-weight: 800; 156 | color: #3a4377; 157 | } 158 | .weizhangdizhi2{ 159 | font-size: 16px; 160 | font-weight: 800; 161 | color: #333; 162 | height: 30px; 163 | line-height: 30px; 164 | 165 | } 166 | .weizhangdizhi3{ 167 | font-size: 12px; 168 | color: #808080; 169 | height:24px; 170 | line-height:16px; 171 | letter-spacing:0.5px; 172 | border-bottom: 1px dashed #d9e3ef; 173 | margin-bottom: 10px; 174 | } 175 | .weizhangdizhi4{ 176 | font-size: 14px; 177 | color: #4b76ff; 178 | height:16px; 179 | line-height:16px; 180 | letter-spacing:0.5px; 181 | padding-top: 16px; 182 | } 183 | .zonghetishi{ 184 | font-size: 18px; 185 | font-weight: 800; 186 | color: #333; 187 | height: 30px; 188 | line-height: 30px; 189 | } 190 | .fenxianghaoyou{ 191 | background-image: linear-gradient(180deg, #3751FF, #4482FF); 192 | height: 44px; 193 | border-top-left-radius:4px; 194 | border-top-right-radius:4px; 195 | border-bottom-left-radius:4px; 196 | border-bottom-right-radius:4px; 197 | font-size: 16px; 198 | line-height:44px; 199 | letter-spacing:1px; 200 | color: #ffffff; 201 | display: block; 202 | } 203 | /* 切换车辆页面样式开始//////////////////////////////////////////////*/ 204 | .wodecheliang-tit{ 205 | color: #7b8699; 206 | padding-top: 20px; 207 | letter-spacing:1px; 208 | } 209 | .qehuancheliangbufen{ 210 | padding: 0px 4%; 211 | text-align: center; 212 | /*margin-top: -95px;*/ 213 | position: relative; 214 | height: auto; 215 | } 216 | .qiehuancheliang-con{ 217 | padding: 0% 4% 4% 4%; 218 | position: relative; 219 | background-image: linear-gradient(180deg, #ebf0ff, #FFFFFF); 220 | } 221 | .aui-list-item-media img{width: 100%;height: auto;} 222 | .cheliangtupian img{width: 100%;height: auto;} 223 | 224 | .shengchengbaogao{ 225 | background-image: linear-gradient(180deg, #3751FF, #4482FF); 226 | height: 40px; 227 | border-top-left-radius:4px; 228 | border-top-right-radius:4px; 229 | border-bottom-left-radius:4px; 230 | border-bottom-right-radius:4px; 231 | font-size: 16px; 232 | line-height:40px; 233 | letter-spacing:1px; 234 | color: #ffffff; 235 | margin-top: 10px; 236 | display: block; 237 | } 238 | .dibuquyu img{width: 100%;height: auto;} 239 | 240 | .img-responsive,.thumbnail > img,.thumbnail a > img,.carousel-inner > .item > img,.carousel-inner > .item > a > img {display: block;max-width: 100%;height: auto;} 241 | 242 | .text-center {text-align: center;} 243 | .text-right{text-align: right;} 244 | p{text-align:justify; text-justify:inter-ideograph;} 245 | a:hover{cursor: pointer;} 246 | @media (max-width: 345px) { 247 | .scroll ul li{ 248 | height:40px; 249 | list-style-type:none; 250 | font-size: 14px; 251 | width:165px; 252 | white-space: nowrap; 253 | overflow: hidden; 254 | text-overflow: ellipsis; 255 | } 256 | } 257 | @media (max-height:812px) { 258 | .qiehuancheliang-con{ 259 | padding: 4% 4% 40% 4%; 260 | position: relative; 261 | background-image: linear-gradient(180deg, #ebf0ff, #FFFFFF); 262 | } 263 | } 264 | @media (max-height:736px) { 265 | .qiehuancheliang-con{ 266 | padding: 0% 4% 3% 4%; 267 | position: relative; 268 | background-image: linear-gradient(180deg, #ebf0ff, #FFFFFF); 269 | } 270 | } 271 | @media (max-height:640px) { 272 | .qiehuancheliang-con { 273 | padding: 0% 4% 3% 4%; 274 | position: relative; 275 | background-image: linear-gradient(180deg, #ebf0ff, #FFFFFF); 276 | } 277 | 278 | .aui-list-item-media img { 279 | width: 100%; 280 | height: auto; 281 | } 282 | } 283 | @media (max-height:568px) { 284 | .qiehuancheliang-con { 285 | padding: 0% 4% 3% 4%; 286 | position: relative; 287 | background-image: linear-gradient(180deg, #ebf0ff, #FFFFFF); 288 | } 289 | .aui-list-item-media img { 290 | width: 95%; 291 | height: auto; 292 | } 293 | } 294 | @media (max-width: 330px) { 295 | .scroll ul li { 296 | height: 40px; 297 | list-style-type: none; 298 | font-size: 14px; 299 | width: 160px; 300 | white-space: nowrap; 301 | overflow: hidden; 302 | text-overflow: ellipsis; 303 | } 304 | .wzfx-biaoti{ 305 | font-size: 12px; 306 | text-align:center; 307 | color: #F1ECFF; 308 | letter-spacing:1px 309 | } 310 | .wzfx-number{ 311 | font-size: 22px; 312 | text-align: center; 313 | color: #ffffff; 314 | font-weight: 800; 315 | } 316 | 317 | .wzdz-number{ 318 | font-size: 16px; 319 | text-align:center; 320 | color: #333; 321 | font-weight: 800; 322 | } 323 | .wzfx-time{ 324 | background-image: linear-gradient(180deg, #F2F2FF, #F2F2FF); 325 | height: 50px; 326 | border-bottom-left-radius:4px; 327 | border-bottom-right-radius:4px; 328 | font-size: 14px; 329 | line-height: 48px; 330 | letter-spacing:1px; 331 | color: #523CBD; 332 | } 333 | .weizhangneirongbufen{ 334 | padding: 0px 16px; 335 | text-align: center; 336 | margin-top: -95px; 337 | position: relative; 338 | } 339 | .weizhangtishineirongbiaoti{ 340 | width: 100px;height: 32px; 341 | border-radius:4px;border: solid 1px #8BDBE7; 342 | background-color: #3699CA;line-height: 32px;color:#ffffff;font-size: 14px; 343 | margin: 0 auto; 344 | z-index:1; 345 | } 346 | .weizhangdizhi2{ 347 | font-size: 14px; 348 | font-weight: 800; 349 | color: #333; 350 | height: 30px; 351 | line-height: 30px; 352 | 353 | } 354 | .weizhangdizhi3 { 355 | font-size: 12px; 356 | color: #959bb9; 357 | height: 24px; 358 | line-height: 16px; 359 | letter-spacing: 0.5px; 360 | border-bottom: 1px dashed #d9e3ef; 361 | margin-bottom: 10px; 362 | } 363 | .wzdz-biaoti{ 364 | font-size: 12px; 365 | text-align:center; 366 | color: #999; 367 | /*padding-left: 26px;*/ 368 | letter-spacing:1px 369 | } 370 | } 371 | 372 | .selectBoxs{ 373 | background-color: rgb(255, 255, 255); 374 | padding: 10px; 375 | line-height: 40px; 376 | position: absolute; 377 | z-index: 19920829; 378 | border-radius: 4px; 379 | text-overflow: ellipsis; 380 | text-align: left; 381 | word-break: keep-all; 382 | overflow: hidden; 383 | white-space: nowrap; 384 | border: 0; 385 | width: 92%; 386 | color:#5e70dc; 387 | appearance:none; 388 | -moz-appearance:none; 389 | -webkit-appearance:none; 390 | display: none; 391 | box-shadow: 1px 1px 6px #cadbe8; 392 | } 393 | .selectBoxs li{ 394 | padding-left: 10px; 395 | } 396 | 397 | .status_circle{ 398 | display: inline-block; 399 | width: 8px; 400 | height: 8px; 401 | background-color: #30cc80; 402 | border-radius: 50%; 403 | margin-right: 7px; 404 | } 405 | .status_circle_hide{ 406 | background-color: orange; 407 | } 408 | 409 | 410 | /*////////////////*/ 411 | 412 | .xuanzechenglian-k{height: 40px; 413 | border: 1px solid #597dff; 414 | border-radius: 4px; 415 | line-height: 40px; 416 | text-align: left; 417 | padding-left: 10px; 418 | position:relative; 419 | font-size: 16px; 420 | } 421 | .qiehuanright-icon{ 422 | position:absolute; 423 | right: 8px; 424 | top: 6px; 425 | } 426 | 427 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzxwfx-banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzxwfx-banner.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzxwfx-can.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzxwfx-can.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzxwfx-che.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzxwfx-che.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzxwfx-jieguo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzxwfx-jieguo.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzxwfx-lu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzxwfx-lu.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzxwfx-luan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzxwfx-luan.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzxwfx-lz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzxwfx-lz.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzxwfx-mi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzxwfx-mi.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzxwfx-shuai.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzxwfx-shuai.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzxwfx-sid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzxwfx-sid.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzxwfx-sid2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzxwfx-sid2.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzxwfx-wen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/wzxwfx-wen.png -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/zhuanquanquna.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safiriGitHub/ZSSnapshotKit/745a5b0ea3a4cd161d143da47a8f017890a25920/ZSSnapshotKit_master/ZSSnapshotKit_master/Source/html/zhuanquanquna.gif -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // ZSSnapshotKit_master 4 | // 5 | // Created by safiri on 2019/5/21. 6 | // Copyright © 2019 safiri. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // ZSSnapshotKit_master 4 | // 5 | // Created by safiri on 2019/5/21. 6 | // Copyright © 2019 safiri. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | #import "WKWebViewTesterViewController.h" 11 | 12 | @interface ViewController () 13 | 14 | @end 15 | 16 | @implementation ViewController 17 | 18 | - (void)viewDidLoad { 19 | [super viewDidLoad]; 20 | 21 | } 22 | 23 | - (IBAction)WKWebViewTester:(id)sender { 24 | 25 | WKWebViewTesterViewController *vc = [[WKWebViewTesterViewController alloc] init]; 26 | [self.navigationController pushViewController:vc animated:YES]; 27 | } 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/WebViewTester/WKWebViewTesterViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // WKWebViewTesterViewController.h 3 | // ZSSnapshotKit_master 4 | // 5 | // Created by safiri on 2019/5/21. 6 | // Copyright © 2019 safiri. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface WKWebViewTesterViewController : UIViewController 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/WebViewTester/WKWebViewTesterViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // WKWebViewTesterViewController.m 3 | // ZSSnapshotKit_master 4 | // 5 | // Created by safiri on 2019/5/21. 6 | // Copyright © 2019 safiri. All rights reserved. 7 | // 8 | 9 | #import "WKWebViewTesterViewController.h" 10 | #import 11 | #import "WKWebView+Snapshot.h" 12 | #import "UIScrollView+Snapshot.h" 13 | #import "SVProgressHUD.h" 14 | 15 | @interface WKWebViewTesterViewController () 16 | 17 | @property (nonatomic, strong) UITableView *tableView; 18 | 19 | @property (nonatomic, strong) NSArray *funcDataArray; 20 | 21 | @property (nonatomic, strong) WKWebView *webView; 22 | 23 | @end 24 | 25 | @implementation WKWebViewTesterViewController 26 | 27 | - (void)viewDidLoad { 28 | [super viewDidLoad]; 29 | self.title = @"WKWebView 测试"; 30 | self.view.backgroundColor = [UIColor whiteColor]; 31 | 32 | [self initView]; 33 | } 34 | 35 | - (void)initView { 36 | 37 | CGFloat tableHeight = self.funcDataArray.count * 30; 38 | self.tableView.frame = CGRectMake(0, 64, self.view.frame.size.width, tableHeight); 39 | [self.view addSubview:self.tableView]; 40 | 41 | CGFloat webView_Y = self.tableView.frame.origin.y + self.tableView.frame.size.height; 42 | self.webView.frame = CGRectMake(0, webView_Y, self.view.frame.size.width, self.view.frame.size.height - webView_Y); 43 | [self.view addSubview:self.webView]; 44 | 45 | NSString *path = [[NSBundle mainBundle] pathForResource:@"weizhangfenxi" ofType:@"html"]; 46 | NSURL *url = [NSURL fileURLWithPath:path]; 47 | 48 | // NSURL *url = [NSURL URLWithString:@"https://www.jianshu.com/u/2809c84474f6"]; 49 | // NSURL *url = [NSURL URLWithString:@"http://pay.egintra.com:8080/wzfx/wzfx/html/weizhangfenxi.html"]; 50 | 51 | [self.webView loadRequest:[NSURLRequest requestWithURL:url]]; 52 | } 53 | 54 | 55 | 56 | // MARK: - 截图 57 | 58 | - (void)takeSnapshotOfVisibleContent { 59 | UIImage *image = [self.webView takeSnapshotOfVisibleContent]; 60 | //展示截图:TODO 61 | 62 | //保存截图到文件: 63 | //NSString *path_document = NSHomeDirectory(); 64 | //设置一个图片的存储路径 65 | //NSString *imagePath = [path_document stringByAppendingString:@"/Documents/picc.png"]; 66 | //把图片直接保存到指定的路径 67 | //同时应该把图片的路径imagePath存起来,下次就可以直接用来取 68 | //[UIImagePNGRepresentation(cutImage) writeToFile:imagePath atomically:YES]; 69 | 70 | //保存截图到照片 71 | UIImageWriteToSavedPhotosAlbum(image, self, @selector(completedWithImage:error:context:), NULL); 72 | } 73 | - (void)sync_takeSnapshotOfFullContent { 74 | UIImage *image = [self.webView takeSnapshotOfFullContent]; 75 | UIImageWriteToSavedPhotosAlbum(image, self, @selector(completedWithImage:error:context:), NULL); 76 | } 77 | - (void)async_takeSnapshotOfFullContent_bySpliter { 78 | [SVProgressHUD show]; 79 | [self.webView.scrollView asyncTakeSnapshotOfFullContent:^(UIImage * _Nullable image) { 80 | [SVProgressHUD dismiss]; 81 | //保存截图到照片 82 | UIImageWriteToSavedPhotosAlbum(image, self, @selector(completedWithImage:error:context:), NULL); 83 | }]; 84 | } 85 | - (void)async_takeSnapshotOfFullContent_byPrinter { 86 | [SVProgressHUD show]; 87 | [self.webView asyncTakeSnapshotOfFullContent:^(UIImage * _Nullable image) { 88 | [SVProgressHUD dismiss]; 89 | //保存截图到照片 90 | UIImageWriteToSavedPhotosAlbum(image, self, @selector(completedWithImage:error:context:), NULL); 91 | }]; 92 | 93 | } 94 | 95 | - (void)completedWithImage:(UIImage *)image error:(NSError *)error context:(void *)contextInfo{ 96 | NSString *toast = (!image || error)? [NSString stringWithFormat:@"保存图片失败 , 错误:%@",error] : @"保存图片成功"; 97 | NSLog(@"%@",toast); 98 | [SVProgressHUD showInfoWithStatus:toast]; 99 | } 100 | 101 | // MARK: - UITableViewDataSource & UITableViewDelegate 102 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 103 | return self.funcDataArray.count; 104 | } 105 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 106 | 107 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]; 108 | cell.textLabel.text = self.funcDataArray[indexPath.row]; 109 | return cell; 110 | } 111 | - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 112 | return 30; 113 | } 114 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 115 | [tableView deselectRowAtIndexPath:indexPath animated:YES]; 116 | 117 | switch (indexPath.row) { 118 | case 0: 119 | [self takeSnapshotOfVisibleContent]; 120 | break; 121 | case 1: 122 | [self sync_takeSnapshotOfFullContent]; 123 | break; 124 | case 2: 125 | [self async_takeSnapshotOfFullContent_bySpliter]; 126 | break; 127 | case 3: 128 | [self async_takeSnapshotOfFullContent_byPrinter]; 129 | break; 130 | 131 | default: 132 | break; 133 | } 134 | } 135 | //MARK: - Get 136 | - (NSArray *)funcDataArray { 137 | if (!_funcDataArray) { 138 | _funcDataArray = @[@"截图可视区域", 139 | @"同步截图全部区域", 140 | @"异步截图全部区域_分页截图方式", 141 | @"异步截图全部区域_打印PDF方式"]; 142 | } 143 | return _funcDataArray; 144 | } 145 | - (UITableView *)tableView { 146 | if (!_tableView) { 147 | _tableView = [[UITableView alloc] init]; 148 | _tableView.delegate = self; 149 | _tableView.dataSource = self; 150 | [_tableView registerClass:UITableViewCell.class forCellReuseIdentifier:@"cell"]; 151 | } 152 | return _tableView; 153 | } 154 | - (WKWebView *)webView { 155 | if (!_webView) { 156 | _webView = [[WKWebView alloc] init]; 157 | _webView.backgroundColor = UIColor.lightGrayColor; 158 | } 159 | return _webView; 160 | } 161 | @end 162 | -------------------------------------------------------------------------------- /ZSSnapshotKit_master/ZSSnapshotKit_master/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // ZSSnapshotKit_master 4 | // 5 | // Created by safiri on 2019/5/21. 6 | // Copyright © 2019 safiri. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | --------------------------------------------------------------------------------