Commit 1814d7235385d5b40676bcc81f2f403115f724fb
1 parent
91798ff4
no message
Showing
4 changed files
with
21 additions
and
209 deletions
CNLiveQrCodeModule/Classes/Controller/CNLiveScanResultController.m
| @@ -52,8 +52,8 @@ | @@ -52,8 +52,8 @@ | ||
| 52 | #pragma mark - 代理 | 52 | #pragma mark - 代理 |
| 53 | - (void)webView:(CNLiveWebView *)webView didFinishLoadWithURL:(NSURL *)url { | 53 | - (void)webView:(CNLiveWebView *)webView didFinishLoadWithURL:(NSURL *)url { |
| 54 | NSLog(@"didFinishLoad"); | 54 | NSLog(@"didFinishLoad"); |
| 55 | - if(webView.navigationItemTitle.length != 0){ | ||
| 56 | - self.navigationBar.title.text = webView.navigationItemTitle; | 55 | + if(webView.title.length != 0){ |
| 56 | + self.navigationBar.title.text = webView.title; | ||
| 57 | }else{ | 57 | }else{ |
| 58 | self.navigationBar.title.text = @"识别结果"; | 58 | self.navigationBar.title.text = @"识别结果"; |
| 59 | 59 | ||
| @@ -83,7 +83,6 @@ | @@ -83,7 +83,6 @@ | ||
| 83 | - (CNLiveWebView *)webView { | 83 | - (CNLiveWebView *)webView { |
| 84 | if (!_webView) { | 84 | if (!_webView) { |
| 85 | _webView = [CNLiveWebView webViewWithFrame:CGRectMake(0, NavigationContentTop, SCREEN_WIDTH, SCREEN_HEIGHT-NavigationContentTop)]; | 85 | _webView = [CNLiveWebView webViewWithFrame:CGRectMake(0, NavigationContentTop, SCREEN_WIDTH, SCREEN_HEIGHT-NavigationContentTop)]; |
| 86 | - _webView.isNavigationBarOrTranslucent = NO; | ||
| 87 | _webView.delegate = self; | 86 | _webView.delegate = self; |
| 88 | } | 87 | } |
| 89 | return _webView; | 88 | return _webView; |
CNLiveQrCodeModule/Classes/View/CNLiveWebView.h deleted
100755 → 0
| 1 | -// | ||
| 2 | -// CNLiveWebView.h | ||
| 3 | -// CNLiveQrCodeModule | ||
| 4 | -// | ||
| 5 | -// Created by 153993236@qq.com on 11/12/2019. | ||
| 6 | -// Copyright (c) 2019 153993236@qq.com. All rights reserved. | ||
| 7 | -// | ||
| 8 | -// CNLiveWebView 使用注意点: | ||
| 9 | -// 如果 self.navigationController.navigationBar.translucent = NO;或者导航栏不存在; 那么 XWWebView 的 isNavigationBarOrTranslucent属性 必须设置 NO) | ||
| 10 | - | ||
| 11 | -#import <UIKit/UIKit.h> | ||
| 12 | -@class CNLiveWebView; | ||
| 13 | - | ||
| 14 | -@protocol CNLiveWebViewDelegate <NSObject> | ||
| 15 | -@optional | ||
| 16 | -/** 页面开始加载时调用 */ | ||
| 17 | -- (void)webViewDidStartLoad:(CNLiveWebView *)webView; | ||
| 18 | -/** 内容开始返回时调用 */ | ||
| 19 | -- (void)webView:(CNLiveWebView *)webView didCommitWithURL:(NSURL *)url; | ||
| 20 | -/** 页面加载失败时调用 */ | ||
| 21 | -- (void)webView:(CNLiveWebView *)webView didFinishLoadWithURL:(NSURL *)url; | ||
| 22 | -/** 页面加载完成之后调用 */ | ||
| 23 | -- (void)webView:(CNLiveWebView *)webView didFailLoadWithError:(NSError *)error; | ||
| 24 | -@end | ||
| 25 | - | ||
| 26 | -@interface CNLiveWebView : UIView | ||
| 27 | -/** XWDelegate */ | ||
| 28 | -@property (nonatomic, weak) id<CNLiveWebViewDelegate> delegate; | ||
| 29 | -/** 进度条颜色(默认蓝色) */ | ||
| 30 | -@property (nonatomic, strong) UIColor *progressViewColor; | ||
| 31 | -/** 导航栏标题 */ | ||
| 32 | -@property (nonatomic, copy) NSString *navigationItemTitle; | ||
| 33 | -/** 导航栏存在且有穿透效果(默认导航栏存在且有穿透效果) */ | ||
| 34 | -@property (nonatomic, assign) BOOL isNavigationBarOrTranslucent; | ||
| 35 | - | ||
| 36 | -/** 类方法创建 XWWebView */ | ||
| 37 | -+ (instancetype)webViewWithFrame:(CGRect)frame; | ||
| 38 | -/** 加载 web */ | ||
| 39 | -- (void)loadRequest:(NSURLRequest *)request; | ||
| 40 | -/** 加载 HTML */ | ||
| 41 | -- (void)loadHTMLString:(NSString *)HTMLString; | ||
| 42 | -/** 刷新数据 */ | ||
| 43 | -- (void)reloadData; | ||
| 44 | - | ||
| 45 | -@end |
CNLiveQrCodeModule/Classes/View/CNLiveWebView.m deleted
100755 → 0
| 1 | -// | ||
| 2 | -// CNLiveWebView.m | ||
| 3 | -// CNLiveQrCodeModule | ||
| 4 | -// | ||
| 5 | -// Created by 153993236@qq.com on 11/12/2019. | ||
| 6 | -// Copyright (c) 2019 153993236@qq.com. All rights reserved. | ||
| 7 | -// | ||
| 8 | - | ||
| 9 | -#import "CNLiveWebView.h" | ||
| 10 | -#import <WebKit/WebKit.h> | ||
| 11 | -#import "QMUIKit.h" | ||
| 12 | - | ||
| 13 | -@interface CNLiveWebView () <WKNavigationDelegate, WKUIDelegate> | ||
| 14 | -// WKWebView | ||
| 15 | -@property (nonatomic, strong) WKWebView *wkWebView; | ||
| 16 | -// 进度条 | ||
| 17 | -@property (nonatomic, strong) UIProgressView *progressView; | ||
| 18 | - | ||
| 19 | -@end | ||
| 20 | - | ||
| 21 | -@implementation CNLiveWebView | ||
| 22 | - | ||
| 23 | -static CGFloat const progressViewHeight = 2; | ||
| 24 | - | ||
| 25 | -- (instancetype)initWithFrame:(CGRect)frame { | ||
| 26 | - if (self = [super initWithFrame:frame]) { | ||
| 27 | - [self addSubview:self.wkWebView]; | ||
| 28 | - [self addSubview:self.progressView]; | ||
| 29 | - } | ||
| 30 | - return self; | ||
| 31 | -} | ||
| 32 | - | ||
| 33 | -+ (instancetype)webViewWithFrame:(CGRect)frame { | ||
| 34 | - return [[self alloc] initWithFrame:frame]; | ||
| 35 | -} | ||
| 36 | - | ||
| 37 | -- (WKWebView *)wkWebView { | ||
| 38 | - if (!_wkWebView) { | ||
| 39 | - _wkWebView = [[WKWebView alloc] initWithFrame:self.bounds]; | ||
| 40 | - _wkWebView.navigationDelegate = self; | ||
| 41 | - _wkWebView.UIDelegate = self; | ||
| 42 | - // KVO | ||
| 43 | - [self.wkWebView addObserver:self forKeyPath:NSStringFromSelector(@selector(estimatedProgress)) options:0 context:nil]; | ||
| 44 | - } | ||
| 45 | - return _wkWebView; | ||
| 46 | -} | ||
| 47 | - | ||
| 48 | -- (UIProgressView *)progressView { | ||
| 49 | - if (!_progressView) { | ||
| 50 | - _progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault]; | ||
| 51 | - _progressView.trackTintColor = [UIColor clearColor]; | ||
| 52 | - // 高度默认有导航栏且有穿透效果 | ||
| 53 | - _progressView.frame = CGRectMake(0, NavigationContentTop, self.frame.size.width, progressViewHeight); | ||
| 54 | - // 设置进度条颜色 | ||
| 55 | - _progressView.tintColor = [UIColor greenColor]; | ||
| 56 | - } | ||
| 57 | - return _progressView; | ||
| 58 | -} | ||
| 59 | - | ||
| 60 | -- (void)setProgressViewColor:(UIColor *)progressViewColor { | ||
| 61 | - _progressViewColor = progressViewColor; | ||
| 62 | - if (progressViewColor) { | ||
| 63 | - _progressView.tintColor = progressViewColor; | ||
| 64 | - } | ||
| 65 | -} | ||
| 66 | - | ||
| 67 | -- (void)setIsNavigationBarOrTranslucent:(BOOL)isNavigationBarOrTranslucent { | ||
| 68 | - _isNavigationBarOrTranslucent = isNavigationBarOrTranslucent; | ||
| 69 | - | ||
| 70 | - if (isNavigationBarOrTranslucent == YES) { // 导航栏存在且有穿透效果 | ||
| 71 | - _progressView.frame = CGRectMake(0, NavigationContentTop, self.frame.size.width, progressViewHeight); | ||
| 72 | - } else { // 导航栏不存在或者没有有穿透效果 | ||
| 73 | - _progressView.frame = CGRectMake(0, 0, self.frame.size.width, progressViewHeight); | ||
| 74 | - } | ||
| 75 | -} | ||
| 76 | - | ||
| 77 | -// KVO | ||
| 78 | -- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context { | ||
| 79 | - if ([keyPath isEqualToString:NSStringFromSelector(@selector(estimatedProgress))] && object == self.wkWebView) { | ||
| 80 | - self.progressView.alpha = 1.0; | ||
| 81 | - BOOL animated = self.wkWebView.estimatedProgress > self.progressView.progress; | ||
| 82 | - [self.progressView setProgress:self.wkWebView.estimatedProgress animated:animated]; | ||
| 83 | - if(self.wkWebView.estimatedProgress >= 0.97) { | ||
| 84 | - [UIView animateWithDuration:0.1 delay:0.3 options:UIViewAnimationOptionCurveEaseOut animations:^{ | ||
| 85 | - self.progressView.alpha = 0.0; | ||
| 86 | - } completion:^(BOOL finished) { | ||
| 87 | - [self.progressView setProgress:0.0 animated:NO]; | ||
| 88 | - }]; | ||
| 89 | - } | ||
| 90 | - } else { | ||
| 91 | - [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; | ||
| 92 | - } | ||
| 93 | -} | ||
| 94 | - | ||
| 95 | -#pragma mark - 加载的状态回调(WKNavigationDelegate) | ||
| 96 | -// 页面开始加载时调用 | ||
| 97 | -- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation { | ||
| 98 | - if (self.delegate && [self.delegate respondsToSelector:@selector(webViewDidStartLoad:)]) { | ||
| 99 | - [self.delegate webViewDidStartLoad:self]; | ||
| 100 | - } | ||
| 101 | -} | ||
| 102 | -// 当内容开始返回时调用 | ||
| 103 | -- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation { | ||
| 104 | - if (self.delegate && [self.delegate respondsToSelector:@selector(webView:didCommitWithURL:)]) { | ||
| 105 | - [self.delegate webView:self didCommitWithURL:self.wkWebView.URL]; | ||
| 106 | - } | ||
| 107 | - self.navigationItemTitle = self.wkWebView.title; | ||
| 108 | -} | ||
| 109 | -// 页面加载完成之后调用 | ||
| 110 | -- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { | ||
| 111 | - self.navigationItemTitle = self.wkWebView.title; | ||
| 112 | - if (self.delegate && [self.delegate respondsToSelector:@selector(webView:didFinishLoadWithURL:)]) { | ||
| 113 | - [self.delegate webView:self didFinishLoadWithURL:self.wkWebView.URL]; | ||
| 114 | - } | ||
| 115 | - self.progressView.alpha = 0.0; | ||
| 116 | -} | ||
| 117 | -// 页面加载失败时调用 | ||
| 118 | -- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error { | ||
| 119 | - if (self.delegate && [self.delegate respondsToSelector:@selector(webView:didFailLoadWithError:)]) { | ||
| 120 | - [self.delegate webView:self didFailLoadWithError:error]; | ||
| 121 | - } | ||
| 122 | - self.progressView.alpha = 0.0; | ||
| 123 | -} | ||
| 124 | -// 加载 web | ||
| 125 | -- (void)loadRequest:(NSURLRequest *)request { | ||
| 126 | - [self.wkWebView loadRequest:request]; | ||
| 127 | -} | ||
| 128 | -// 加载 HTML | ||
| 129 | -- (void)loadHTMLString:(NSString *)HTMLString { | ||
| 130 | - [self.wkWebView loadHTMLString:HTMLString baseURL:nil]; | ||
| 131 | -} | ||
| 132 | -// 刷新数据 | ||
| 133 | -- (void)reloadData { | ||
| 134 | - [self.wkWebView reload]; | ||
| 135 | -} | ||
| 136 | -// dealloc | ||
| 137 | -- (void)dealloc { | ||
| 138 | - [self.wkWebView removeObserver:self forKeyPath:NSStringFromSelector(@selector(estimatedProgress))]; | ||
| 139 | -} | ||
| 140 | - | ||
| 141 | - | ||
| 142 | -@end |
Example/CNLiveQrCodeModule.xcodeproj/project.pbxproj
| @@ -207,8 +207,8 @@ | @@ -207,8 +207,8 @@ | ||
| 207 | 6003F586195388D20070C39A /* Sources */, | 207 | 6003F586195388D20070C39A /* Sources */, |
| 208 | 6003F587195388D20070C39A /* Frameworks */, | 208 | 6003F587195388D20070C39A /* Frameworks */, |
| 209 | 6003F588195388D20070C39A /* Resources */, | 209 | 6003F588195388D20070C39A /* Resources */, |
| 210 | - 936400C36A68BB4DAA5C8A6E /* [CP] Embed Pods Frameworks */, | ||
| 211 | - 4644CC2D244368A8795F234F /* [CP] Copy Pods Resources */, | 210 | + A6874231ED8CBF0F3DD0EA37 /* [CP] Embed Pods Frameworks */, |
| 211 | + 03C7BF1E246C9ADAE9CFD775 /* [CP] Copy Pods Resources */, | ||
| 212 | ); | 212 | ); |
| 213 | buildRules = ( | 213 | buildRules = ( |
| 214 | ); | 214 | ); |
| @@ -299,44 +299,44 @@ | @@ -299,44 +299,44 @@ | ||
| 299 | /* End PBXResourcesBuildPhase section */ | 299 | /* End PBXResourcesBuildPhase section */ |
| 300 | 300 | ||
| 301 | /* Begin PBXShellScriptBuildPhase section */ | 301 | /* Begin PBXShellScriptBuildPhase section */ |
| 302 | - 331689B0771077B305836D8A /* [CP] Check Pods Manifest.lock */ = { | 302 | + 03C7BF1E246C9ADAE9CFD775 /* [CP] Copy Pods Resources */ = { |
| 303 | isa = PBXShellScriptBuildPhase; | 303 | isa = PBXShellScriptBuildPhase; |
| 304 | buildActionMask = 2147483647; | 304 | buildActionMask = 2147483647; |
| 305 | files = ( | 305 | files = ( |
| 306 | ); | 306 | ); |
| 307 | - inputFileListPaths = ( | ||
| 308 | - ); | ||
| 309 | inputPaths = ( | 307 | inputPaths = ( |
| 310 | - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", | ||
| 311 | - "${PODS_ROOT}/Manifest.lock", | ||
| 312 | - ); | ||
| 313 | - name = "[CP] Check Pods Manifest.lock"; | ||
| 314 | - outputFileListPaths = ( | 308 | + "${PODS_ROOT}/Target Support Files/Pods-CNLiveQrCodeModule_Example/Pods-CNLiveQrCodeModule_Example-resources.sh", |
| 309 | + "${PODS_CONFIGURATION_BUILD_DIR}/CNLiveQrCodeModule/CNLiveQrCodeModule.bundle", | ||
| 315 | ); | 310 | ); |
| 311 | + name = "[CP] Copy Pods Resources"; | ||
| 316 | outputPaths = ( | 312 | outputPaths = ( |
| 317 | - "$(DERIVED_FILE_DIR)/Pods-CNLiveQrCodeModule_Example-checkManifestLockResult.txt", | 313 | + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/CNLiveQrCodeModule.bundle", |
| 318 | ); | 314 | ); |
| 319 | runOnlyForDeploymentPostprocessing = 0; | 315 | runOnlyForDeploymentPostprocessing = 0; |
| 320 | shellPath = /bin/sh; | 316 | shellPath = /bin/sh; |
| 321 | - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; | 317 | + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-CNLiveQrCodeModule_Example/Pods-CNLiveQrCodeModule_Example-resources.sh\"\n"; |
| 322 | showEnvVarsInLog = 0; | 318 | showEnvVarsInLog = 0; |
| 323 | }; | 319 | }; |
| 324 | - 4644CC2D244368A8795F234F /* [CP] Copy Pods Resources */ = { | 320 | + 331689B0771077B305836D8A /* [CP] Check Pods Manifest.lock */ = { |
| 325 | isa = PBXShellScriptBuildPhase; | 321 | isa = PBXShellScriptBuildPhase; |
| 326 | buildActionMask = 2147483647; | 322 | buildActionMask = 2147483647; |
| 327 | files = ( | 323 | files = ( |
| 328 | ); | 324 | ); |
| 325 | + inputFileListPaths = ( | ||
| 326 | + ); | ||
| 329 | inputPaths = ( | 327 | inputPaths = ( |
| 330 | - "${PODS_ROOT}/Target Support Files/Pods-CNLiveQrCodeModule_Example/Pods-CNLiveQrCodeModule_Example-resources.sh", | ||
| 331 | - "${PODS_CONFIGURATION_BUILD_DIR}/CNLiveQrCodeModule/CNLiveQrCodeModule.bundle", | 328 | + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", |
| 329 | + "${PODS_ROOT}/Manifest.lock", | ||
| 330 | + ); | ||
| 331 | + name = "[CP] Check Pods Manifest.lock"; | ||
| 332 | + outputFileListPaths = ( | ||
| 332 | ); | 333 | ); |
| 333 | - name = "[CP] Copy Pods Resources"; | ||
| 334 | outputPaths = ( | 334 | outputPaths = ( |
| 335 | - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/CNLiveQrCodeModule.bundle", | 335 | + "$(DERIVED_FILE_DIR)/Pods-CNLiveQrCodeModule_Example-checkManifestLockResult.txt", |
| 336 | ); | 336 | ); |
| 337 | runOnlyForDeploymentPostprocessing = 0; | 337 | runOnlyForDeploymentPostprocessing = 0; |
| 338 | shellPath = /bin/sh; | 338 | shellPath = /bin/sh; |
| 339 | - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-CNLiveQrCodeModule_Example/Pods-CNLiveQrCodeModule_Example-resources.sh\"\n"; | 339 | + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; |
| 340 | showEnvVarsInLog = 0; | 340 | showEnvVarsInLog = 0; |
| 341 | }; | 341 | }; |
| 342 | 667E6DC32E1A51CD56D1B74A /* [CP] Check Pods Manifest.lock */ = { | 342 | 667E6DC32E1A51CD56D1B74A /* [CP] Check Pods Manifest.lock */ = { |
| @@ -361,7 +361,7 @@ | @@ -361,7 +361,7 @@ | ||
| 361 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; | 361 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; |
| 362 | showEnvVarsInLog = 0; | 362 | showEnvVarsInLog = 0; |
| 363 | }; | 363 | }; |
| 364 | - 936400C36A68BB4DAA5C8A6E /* [CP] Embed Pods Frameworks */ = { | 364 | + A6874231ED8CBF0F3DD0EA37 /* [CP] Embed Pods Frameworks */ = { |
| 365 | isa = PBXShellScriptBuildPhase; | 365 | isa = PBXShellScriptBuildPhase; |
| 366 | buildActionMask = 2147483647; | 366 | buildActionMask = 2147483647; |
| 367 | files = ( | 367 | files = ( |