From 19593dc6431d708708d28047616230a18b876d71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=BF=97=E6=84=8F?= Date: Wed, 9 Aug 2017 16:23:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E9=80=9A=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NJKWebViewProgress/NJKWebViewProgress.h | 36 ---- .../\350\257\264\346\230\216.txt" | 2 - .../UserInterfaceState.xcuserstate | Bin 47048 -> 48102 bytes .../project.pbxproj | 131 +++++++------- .../{ => DKWebView}/AppDelegate.h | 0 .../DKWebView/DKActivitySafari.h | 6 +- .../DKWebView/DKActivitySafari.m | 14 +- .../DKWebView/DKUIWebViewController.h | 12 +- .../DKWebView/DKUIWebViewController.m | 46 ++--- .../DKWebView/DKWKWebViewController.h | 94 +++++----- .../DKWebView/DKWKWebViewController.m | 162 +++++++++--------- .../webViewCompatible/DKWebView/DKWebView.h | 22 +++ .../webViewCompatible/DKWebView/Info.plist | 24 +++ .../NJKWebViewProgress/DKWebViewProgress.h | 36 ++++ .../NJKWebViewProgress/DKWebViewProgress.m | 20 +-- .../DKWebViewProgressView.h | 4 +- .../DKWebViewProgressView.m | 6 +- .../webViewCompatible/DKWebView/ReadMe.txt | 20 +++ .../UIImage+DKWebViewControllerIcons.h | 18 +- .../UIImage+DKWebViewControllerIcons.m | 24 +-- .../{ => DKWebView}/WebviewCompatibleTool.h | 0 .../{ => DKWebView}/WebviewCompatibleTool.m | 15 +- .../webViewCompatible/ViewController.m | 28 +-- 23 files changed, 396 insertions(+), 324 deletions(-) delete mode 100755 TO/TOWebViewController/NJKWebViewProgress/NJKWebViewProgress.h delete mode 100644 "TO/TOWebViewController/\350\257\264\346\230\216.txt" rename webViewCompatible/webViewCompatible/{ => DKWebView}/AppDelegate.h (100%) rename TO/TOWebViewController/TOActivitySafari.h => webViewCompatible/webViewCompatible/DKWebView/DKActivitySafari.h (91%) rename TO/TOWebViewController/TOActivitySafari.m => webViewCompatible/webViewCompatible/DKWebView/DKActivitySafari.m (99%) rename TO/TOWebViewController/TOWebViewController.h => webViewCompatible/webViewCompatible/DKWebView/DKUIWebViewController.h (94%) rename TO/TOWebViewController/TOWebViewController.m => webViewCompatible/webViewCompatible/DKWebView/DKUIWebViewController.m (98%) rename DN/Source/Classes/DZNWebViewController.h => webViewCompatible/webViewCompatible/DKWebView/DKWKWebViewController.h (58%) rename DN/Source/Classes/DZNWebViewController.m => webViewCompatible/webViewCompatible/DKWebView/DKWKWebViewController.m (82%) create mode 100644 webViewCompatible/webViewCompatible/DKWebView/DKWebView.h create mode 100644 webViewCompatible/webViewCompatible/DKWebView/Info.plist create mode 100755 webViewCompatible/webViewCompatible/DKWebView/NJKWebViewProgress/DKWebViewProgress.h rename TO/TOWebViewController/NJKWebViewProgress/NJKWebViewProgress.m => webViewCompatible/webViewCompatible/DKWebView/NJKWebViewProgress/DKWebViewProgress.m (92%) rename TO/TOWebViewController/NJKWebViewProgress/NJKWebViewProgressView.h => webViewCompatible/webViewCompatible/DKWebView/NJKWebViewProgress/DKWebViewProgressView.h (88%) rename TO/TOWebViewController/NJKWebViewProgress/NJKWebViewProgressView.m => webViewCompatible/webViewCompatible/DKWebView/NJKWebViewProgress/DKWebViewProgressView.m (95%) create mode 100644 webViewCompatible/webViewCompatible/DKWebView/ReadMe.txt rename TO/TOWebViewController/UIImage+TOWebViewControllerIcons.h => webViewCompatible/webViewCompatible/DKWebView/UIImage+DKWebViewControllerIcons.h (72%) rename TO/TOWebViewController/UIImage+TOWebViewControllerIcons.m => webViewCompatible/webViewCompatible/DKWebView/UIImage+DKWebViewControllerIcons.m (97%) rename webViewCompatible/webViewCompatible/{ => DKWebView}/WebviewCompatibleTool.h (100%) rename webViewCompatible/webViewCompatible/{ => DKWebView}/WebviewCompatibleTool.m (74%) diff --git a/TO/TOWebViewController/NJKWebViewProgress/NJKWebViewProgress.h b/TO/TOWebViewController/NJKWebViewProgress/NJKWebViewProgress.h deleted file mode 100755 index 1e1ac3e..0000000 --- a/TO/TOWebViewController/NJKWebViewProgress/NJKWebViewProgress.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// NJKWebViewProgress.h -// -// Created by Satoshi Aasano on 4/20/13. -// Copyright (c) 2013 Satoshi Asano. All rights reserved. -// - -#import -#import - -#undef njk_weak -#if __has_feature(objc_arc_weak) -#define njk_weak weak -#else -#define njk_weak unsafe_unretained -#endif - -extern const float NJKInitialProgressValue; -extern const float NJKInteractiveProgressValue; -extern const float NJKFinalProgressValue; - -typedef void (^NJKWebViewProgressBlock)(float progress); -@protocol NJKWebViewProgressDelegate; -@interface NJKWebViewProgress : NSObject -@property (nonatomic, njk_weak) idprogressDelegate; -@property (nonatomic, njk_weak) idwebViewProxyDelegate; -@property (nonatomic, copy) NJKWebViewProgressBlock progressBlock; -@property (nonatomic, readonly) float progress; // 0.0..1.0 - -- (void)reset; -@end - -@protocol NJKWebViewProgressDelegate -- (void)webViewProgress:(NJKWebViewProgress *)webViewProgress updateProgress:(float)progress; -@end - diff --git "a/TO/TOWebViewController/\350\257\264\346\230\216.txt" "b/TO/TOWebViewController/\350\257\264\346\230\216.txt" deleted file mode 100644 index 40b4c27..0000000 --- "a/TO/TOWebViewController/\350\257\264\346\230\216.txt" +++ /dev/null @@ -1,2 +0,0 @@ -UIWebView的优秀in app browser -阅读源码,裁剪它,使得契合需要 diff --git a/WebViewCompatible.xcworkspace/xcuserdata/alldk.xcuserdatad/UserInterfaceState.xcuserstate b/WebViewCompatible.xcworkspace/xcuserdata/alldk.xcuserdatad/UserInterfaceState.xcuserstate index 1d0fdbc3770f6a4cfdfae1fb7e58a26c249165fb..504cfa080975c0621b88e1bf7fc53051cfd8bcd1 100644 GIT binary patch literal 48102 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

Bk4?HcDb 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 literal 47048 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 -extern NSString *const TOActivityTypeSafari; +extern NSString *const DKActivityTypeSafari; -@interface TOActivitySafari : UIActivity +@interface DKActivitySafari : UIActivity @end diff --git a/TO/TOWebViewController/TOActivitySafari.m b/webViewCompatible/webViewCompatible/DKWebView/DKActivitySafari.m similarity index 99% rename from TO/TOWebViewController/TOActivitySafari.m rename to webViewCompatible/webViewCompatible/DKWebView/DKActivitySafari.m index a72734c..b0ff17c 100644 --- a/TO/TOWebViewController/TOActivitySafari.m +++ b/webViewCompatible/webViewCompatible/DKWebView/DKActivitySafari.m @@ -1,5 +1,5 @@ // -// TOActivitySafari.m +// DKActivitySafari.m // // Copyright 2013-2016 Timothy Oliver. All rights reserved. // @@ -20,9 +20,9 @@ // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR // IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -#import "TOActivitySafari.h" +#import "DKActivitySafari.h" -NSString *const TOActivityTypeSafari = @"au.com.timoliver.TOActivityTypeSafari"; +NSString *const DKActivityTypeSafari = @"com.alldk.DKActivityTypeSafari"; /* Detect if we're running iOS 7.0 or higher */ #ifndef NSFoundationVersionNumber_iOS_6_1 @@ -33,7 +33,7 @@ /* Detect which user idiom we're running on */ #define IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) -@interface TOActivitySafari () +@interface DKActivitySafari () /* The URL to load */ @property (nonatomic, strong) NSURL *url; @@ -42,12 +42,12 @@ + (UIImage *)sharedActivityImage; @end -@implementation TOActivitySafari +@implementation DKActivitySafari #pragma mark - Activity Display Properties - - (NSString *)activityType { - return TOActivityTypeSafari; + return DKActivityTypeSafari; } - (NSString *)activityTitle @@ -57,7 +57,7 @@ - (NSString *)activityTitle - (UIImage *)activityImage { - return [TOActivitySafari sharedActivityImage]; + return [DKActivitySafari sharedActivityImage]; } #pragma mark - Activity Action Handlers - diff --git a/TO/TOWebViewController/TOWebViewController.h b/webViewCompatible/webViewCompatible/DKWebView/DKUIWebViewController.h similarity index 94% rename from TO/TOWebViewController/TOWebViewController.h rename to webViewCompatible/webViewCompatible/DKWebView/DKUIWebViewController.h index 0ee13c4..496dd6a 100755 --- a/TO/TOWebViewController/TOWebViewController.h +++ b/webViewCompatible/webViewCompatible/DKWebView/DKUIWebViewController.h @@ -1,5 +1,5 @@ // -// TOWebViewController.h +// DKUIWebViewController.h // // Copyright 2013-2016 Timothy Oliver. All rights reserved. // @@ -22,23 +22,23 @@ #import -@interface TOWebViewController : UIViewController +@interface DKUIWebViewController : UIViewController /** - Initializes a new `TOWebViewController` object with the specified URL. + Initializes a new `DKUIWebViewController` object with the specified URL. @param url The URL to the web page that the controller will initially display. - @return The newly initialized `TOWebViewController` object. + @return The newly initialized `DKUIWebViewController` object. */ - (instancetype)initWithURL:(NSURL *)url; /** - Initializes a new `TOWebViewController` object with the specified URL string. + Initializes a new `DKUIWebViewController` object with the specified URL string. @param urlString The URL as a string, of the web page that the controller will initially display. - @return The newly initialized `TOWebViewController` object. + @return The newly initialized `DKUIWebViewController` object. */ - (instancetype)initWithURLString:(NSString *)urlString; diff --git a/TO/TOWebViewController/TOWebViewController.m b/webViewCompatible/webViewCompatible/DKWebView/DKUIWebViewController.m similarity index 98% rename from TO/TOWebViewController/TOWebViewController.m rename to webViewCompatible/webViewCompatible/DKWebView/DKUIWebViewController.m index b7dd793..3d31a00 100755 --- a/TO/TOWebViewController/TOWebViewController.m +++ b/webViewCompatible/webViewCompatible/DKWebView/DKUIWebViewController.m @@ -1,5 +1,5 @@ // -// TOWebViewController.m +// DKUIWebViewController.m // // Copyright 2013-2016 Timothy Oliver. All rights reserved. // @@ -20,13 +20,13 @@ // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR // IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -#import "TOWebViewController.h" -#import "TOActivitySafari.h" +#import "DKUIWebViewController.h" +#import "DKActivitySafari.h" -#import "UIImage+TOWebViewControllerIcons.h" +#import "UIImage+DKWebViewControllerIcons.h" -#import "NJKWebViewProgress.h" -#import "NJKWebViewProgressView.h" +#import "DKWebViewProgress.h" +#import "DKWebViewProgressView.h" #import #import @@ -60,11 +60,11 @@ #pragma mark - #pragma mark Hidden Properties/Methods -@interface TOWebViewController () + DKWebViewProgressDelegate,CAAnimationDelegate> { //The state of the UIWebView's scroll view before the rotation animation has started @@ -91,7 +91,7 @@ @interface TOWebViewController () navDelegate; +@property (nonatomic, weak) id navDelegate; @end -@protocol DZNNavigationDelegate +@protocol DKNavigationDelegate -- (void)webView:(DZNWebView *)webView didUpdateProgress:(CGFloat)progress; +- (void)webView:(DKWKWebView *)webView didUpdateProgress:(CGFloat)progress; @end @@ -67,7 +67,7 @@ typedef NS_OPTIONS(NSUInteger, DZNWebNavigationPrompt) { /** A very simple web browser with useful navigation and tooling features. */ -@interface DZNWebViewController : UIViewController +@interface DKWKWebViewController : UIViewController /* lzy注170805: 把TO的『done』按钮的移植过来 @@ -89,15 +89,15 @@ typedef NS_OPTIONS(NSUInteger, DZNWebNavigationPrompt) { /** The web view that the controller manages. */ -@property (nonatomic, strong) DZNWebView *webView; +@property (nonatomic, strong) DKWKWebView *webView; /** The URL identifying the location of the content to load. */ @property (nonatomic, readwrite) NSURL *URL; /** The supported navigation tool bar items. Default is All. */ -@property (nonatomic, readwrite) DZNWebNavigationTools supportedWebNavigationTools; +@property (nonatomic, readwrite) DKWKWebNavigationTools supportedWebNavigationTools; /** The supported actions like sharing and copy link, add to reading list, open in Safari, etc. Default is All. */ -@property (nonatomic, readwrite) DZNsupportedWebActions supportedWebActions; -/** The information to be shown on navigation bar. Default is DZNWebNavigationPromptAll. */ -@property (nonatomic, readwrite) DZNWebNavigationPrompt webNavigationPrompt; +@property (nonatomic, readwrite) DKsupportedWebActions supportedWebActions; +/** The information to be shown on navigation bar. Default is DKWKWebNavigationPromptAll. */ +@property (nonatomic, readwrite) DKWKWebNavigationPrompt webNavigationPrompt; /** Yes if a progress bar indicates the . Default is YES. */ @property (nonatomic) BOOL showLoadingProgress; /** YES if long pressing the backward and forward buttons the navigation history is displayed. Default is YES. */ @@ -117,7 +117,7 @@ typedef NS_OPTIONS(NSUInteger, DZNWebNavigationPrompt) { @param URL The HTTP URL to be requested. @returns The initialized webview controller. */ -- (instancetype)initWithURL:(NSURL *)URL; +- (instancetype)initWithURL:(NSURL *)URL tab:(BOOL)tab; /** Initializes and returns a newly created webview controller for local HTML navigation. @@ -146,15 +146,15 @@ typedef NS_OPTIONS(NSUInteger, DZNWebNavigationPrompt) { /// @name Appearance customisation ///------------------------------------------------ -// The back button displayed on the tool bar (requieres DZNWebNavigationToolBackward) +// The back button displayed on the tool bar (requieres DKWKWebNavigationToolBackward) @property (nonatomic, strong) UIImage *backwardButtonImage; -// The forward button displayed on the tool bar (requieres DZNWebNavigationToolForward) +// The forward button displayed on the tool bar (requieres DKWKWebNavigationToolForward) @property (nonatomic, strong) UIImage *forwardButtonImage; -// The stop button displayed on the tool bar (requieres DZNWebNavigationToolStopReload) +// The stop button displayed on the tool bar (requieres DKWKWebNavigationToolStopReload) @property (nonatomic, strong) UIImage *stopButtonImage; -// The reload button displayed on the tool bar (requieres DZNWebNavigationToolStopReload) +// The reload button displayed on the tool bar (requieres DKWKWebNavigationToolStopReload) @property (nonatomic, strong) UIImage *reloadButtonImage; -// The action button displayed on the navigation bar (requieres at least 1 DZNsupportedWebActions value) +// The action button displayed on the navigation bar (requieres at least 1 DKsupportedWebActions value) @property (nonatomic, strong) UIImage *actionButtonImage; @@ -162,15 +162,15 @@ typedef NS_OPTIONS(NSUInteger, DZNWebNavigationPrompt) { /// @name Delegate Methods Requiring Super ///------------------------------------------------ -// DZNNavigationDelegate -- (void)webView:(DZNWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation NS_REQUIRES_SUPER; -- (void)webView:(DZNWebView *)webView didCommitNavigation:(WKNavigation *)navigation NS_REQUIRES_SUPER; -- (void)webView:(DZNWebView *)webView didUpdateProgress:(CGFloat)progress NS_REQUIRES_SUPER; -- (void)webView:(DZNWebView *)webView didFinishNavigation:(WKNavigation *)navigation NS_REQUIRES_SUPER; -- (void)webView:(DZNWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error NS_REQUIRES_SUPER; +// DKNavigationDelegate +- (void)webView:(DKWKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation NS_REQUIRES_SUPER; +- (void)webView:(DKWKWebView *)webView didCommitNavigation:(WKNavigation *)navigation NS_REQUIRES_SUPER; +- (void)webView:(DKWKWebView *)webView didUpdateProgress:(CGFloat)progress NS_REQUIRES_SUPER; +- (void)webView:(DKWKWebView *)webView didFinishNavigation:(WKNavigation *)navigation NS_REQUIRES_SUPER; +- (void)webView:(DKWKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error NS_REQUIRES_SUPER; // WKUIDelegate -- (DZNWebView *)webView:(DZNWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures NS_REQUIRES_SUPER; +- (DKWKWebView *)webView:(DKWKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures NS_REQUIRES_SUPER; // UITableViewDataSource - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView NS_REQUIRES_SUPER; diff --git a/DN/Source/Classes/DZNWebViewController.m b/webViewCompatible/webViewCompatible/DKWebView/DKWKWebViewController.m similarity index 82% rename from DN/Source/Classes/DZNWebViewController.m rename to webViewCompatible/webViewCompatible/DKWebView/DKWKWebViewController.m index d0554c7..ea04270 100644 --- a/DN/Source/Classes/DZNWebViewController.m +++ b/webViewCompatible/webViewCompatible/DKWebView/DKWKWebViewController.m @@ -1,27 +1,27 @@ // -// DZNWebViewController.m -// DZNWebViewController -// https://github.com/dzenbot/DZNWebViewController +// DKWKWebViewController.m +// DKWKWebViewController +// https://github.com/dzenbot/DKWKWebViewController // // Created by Ignacio Romero Zurbuchen on 10/25/13. -// Copyright (c) 2014 DZN Labs. All rights reserved. +// Copyright (c) 2014 DK Labs. All rights reserved. // Licence: MIT-Licence // -#import "DZNWebViewController.h" -#import "UIImage+TOWebViewControllerIcons.h" -#import "TOActivitySafari.h" -//#import "DZNPolyActivity.h" -#define DZN_IS_IPAD ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) -#define DZN_IS_LANDSCAPE ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeLeft || [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeRight) +#import "DKWKWebViewController.h" +#import "UIImage+DKWebViewControllerIcons.h" +#import "DKActivitySafari.h" -static char DZNWebViewControllerKVOContext = 0; +#define DK_IS_IPAD ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) +#define DK_IS_LANDSCAPE ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeLeft || [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeRight) -#pragma mark - ================== DZNWebView ================== +static char DKWKWebViewControllerKVOContext = 0; -@implementation DZNWebView +#pragma mark - ================== DKWKWebView ================== -- (void)setNavDelegate:(id)delegate +@implementation DKWKWebView + +- (void)setNavDelegate:(id)delegate { if (!delegate || (self.navDelegate && ![self.navDelegate isEqual:delegate])) { [self removeObserver:self forKeyPath:NSStringFromSelector(@selector(estimatedProgress))]; @@ -52,10 +52,10 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N } @end -#pragma mark - ================== DZNWebView ================== +#pragma mark - ================== DKWKWebView ================== -#pragma mark - ================== DZNWebViewController ================== -@interface DZNWebViewController () +#pragma mark - ================== DKWKWebViewController ================== +@interface DKWKWebViewController () /* lzy注170805: TO done btn 移植 */ @@ -77,10 +77,10 @@ @interface DZNWebViewController () @property (nonatomic, weak) UIView *navigationBarSuperView; @property (nonatomic) BOOL completedInitialLoad; - +@property (nonatomic, assign)BOOL tab; @end -@implementation DZNWebViewController +@implementation DKWKWebViewController @synthesize URL = _URL; - (instancetype)init @@ -92,20 +92,22 @@ - (instancetype)init return self; } -- (instancetype)initWithURL:(NSURL *)URL +- (instancetype)initWithURL:(NSURL *)URL tab:(BOOL)tab { NSParameterAssert(URL); - + self = [self init]; if (self) { _URL = URL; + _tab = tab; + self.webView.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height - tab == YES ? 64 : 0); } return self; } - (instancetype)initWithFileURL:(NSURL *)URL { - return [self initWithURL:URL]; + return [self initWithURL:URL tab:NO]; } - (void)awakeFromNib @@ -116,21 +118,21 @@ - (void)awakeFromNib - (void)commonInit { - self.supportedWebNavigationTools = DZNWebNavigationToolAll; - self.supportedWebActions = DZNWebActionAll; - self.webNavigationPrompt = DZNWebNavigationPromptAll; + self.supportedWebNavigationTools = DKWKWebNavigationToolAll; + self.supportedWebActions = DKWKWebActionAll; + self.webNavigationPrompt = DKWKWebNavigationPromptAll; self.showLoadingProgress = YES; self.hideBarsWithGestures = YES; self.allowHistory = YES; - self.webView = [[DZNWebView alloc] initWithFrame:self.view.bounds configuration:[WKWebViewConfiguration new]]; + self.webView = [[DKWKWebView alloc] initWithFrame:self.view.bounds configuration:[WKWebViewConfiguration new]]; self.webView.backgroundColor = [UIColor whiteColor]; self.webView.allowsBackForwardNavigationGestures = YES; self.webView.UIDelegate = self; self.webView.navDelegate = self; self.webView.scrollView.delegate = self; - [self.webView addObserver:self forKeyPath:@"loading" options:NSKeyValueObservingOptionNew context:&DZNWebViewControllerKVOContext]; + [self.webView addObserver:self forKeyPath:@"loading" options:NSKeyValueObservingOptionNew context:&DKWKWebViewControllerKVOContext]; self.completedInitialLoad = NO; /* lzy注170805: TO 的 done btn @@ -323,22 +325,22 @@ - (NSArray *)navigationToolItems UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:NULL]; - if ((self.supportedWebNavigationTools & DZNWebNavigationToolBackward) > 0 || self.supportsAllNavigationTools) { + if ((self.supportedWebNavigationTools & DKWKWebNavigationToolBackward) > 0 || self.supportsAllNavigationTools) { [items addObject:self.backwardBarItem]; } - if ((self.supportedWebNavigationTools & DZNWebNavigationToolForward) > 0 || self.supportsAllNavigationTools) { - if (!DZN_IS_IPAD) [items addObject:flexibleSpace]; + if ((self.supportedWebNavigationTools & DKWKWebNavigationToolForward) > 0 || self.supportsAllNavigationTools) { + if (!DK_IS_IPAD) [items addObject:flexibleSpace]; [items addObject:self.forwardBarItem]; } - if ((self.supportedWebNavigationTools & DZNWebNavigationToolStopReload) > 0 || self.supportsAllNavigationTools) { - if (!DZN_IS_IPAD) [items addObject:flexibleSpace]; + if ((self.supportedWebNavigationTools & DKWKWebNavigationToolStopReload) > 0 || self.supportsAllNavigationTools) { + if (!DK_IS_IPAD) [items addObject:flexibleSpace]; [items addObject:self.stateBarItem]; } if (self.supportedWebActions > 0) { - if (!DZN_IS_IPAD) [items addObject:flexibleSpace]; + if (!DK_IS_IPAD) [items addObject:flexibleSpace]; [items addObject:self.actionBarItem]; } @@ -347,13 +349,13 @@ - (NSArray *)navigationToolItems - (BOOL)supportsAllNavigationTools { - return (_supportedWebNavigationTools == DZNWebNavigationToolAll) ? YES : NO; + return (_supportedWebNavigationTools == DKWKWebNavigationToolAll) ? YES : NO; } - (UIImage *)backwardButtonImage { if (!_backwardButtonImage) { - _backwardButtonImage = [UIImage TOWebViewControllerIcon_backButtonWithAttributes:@{}]; + _backwardButtonImage = [UIImage DKWebViewControllerIcon_backButtonWithAttributes:@{}]; } return _backwardButtonImage; } @@ -361,7 +363,7 @@ - (UIImage *)backwardButtonImage - (UIImage *)forwardButtonImage { if (!_forwardButtonImage) { - _forwardButtonImage = [UIImage TOWebViewControllerIcon_forwardButtonWithAttributes:@{}]; + _forwardButtonImage = [UIImage DKWebViewControllerIcon_forwardButtonWithAttributes:@{}]; } return _forwardButtonImage; } @@ -369,7 +371,7 @@ - (UIImage *)forwardButtonImage - (UIImage *)reloadButtonImage { if (!_reloadButtonImage) { - _reloadButtonImage = [UIImage TOWebViewControllerIcon_refreshButtonWithAttributes:@{}]; + _reloadButtonImage = [UIImage DKWebViewControllerIcon_refreshButtonWithAttributes:@{}]; } return _reloadButtonImage; } @@ -377,7 +379,7 @@ - (UIImage *)reloadButtonImage - (UIImage *)stopButtonImage { if (!_stopButtonImage) { - _stopButtonImage = [UIImage TOWebViewControllerIcon_stopButtonWithAttributes:@{}]; + _stopButtonImage = [UIImage DKWebViewControllerIcon_stopButtonWithAttributes:@{}]; } return _stopButtonImage; } @@ -385,7 +387,7 @@ - (UIImage *)stopButtonImage - (UIImage *)actionButtonImage { if (!_actionButtonImage) { - _actionButtonImage = [UIImage TOWebViewControllerIcon_actionButtonWithAttributes:@{}]; + _actionButtonImage = [UIImage DKWebViewControllerIcon_actionButtonWithAttributes:@{}]; } return _actionButtonImage; } @@ -400,8 +402,8 @@ - (NSArray *)applicationActivitiesForItem:(id)item - if ((_supportedWebActions & DZNWebActionOpenSafari) || self.supportsAllActions) { - [activities addObject:[TOActivitySafari new]]; + if ((_supportedWebActions & DKWKWebActionOpenSafari) || self.supportsAllActions) { + [activities addObject:[DKActivitySafari new]]; } @@ -424,13 +426,13 @@ - (NSArray *)applicationActivitiesForItem:(id)item // return types; // } // -// if ((_supportedWebActions & DZNsupportedWebActionshareLink) == 0) { +// if ((_supportedWebActions & DKsupportedWebActionshareLink) == 0) { // [types addObjectsFromArray:@[UIActivityTypeMail, UIActivityTypeMessage, // UIActivityTypePostToFacebook, UIActivityTypePostToTwitter, // UIActivityTypePostToWeibo, UIActivityTypePostToTencentWeibo, // UIActivityTypeAirDrop]]; // } -// if ((_supportedWebActions & DZNWebActionReadLater) == 0 && [item isKindOfClass:[UIImage class]]) { +// if ((_supportedWebActions & DKWKWebActionReadLater) == 0 && [item isKindOfClass:[UIImage class]]) { // [types addObject:UIActivityTypeAddToReadingList]; // } // @@ -439,7 +441,7 @@ - (NSArray *)applicationActivitiesForItem:(id)item - (BOOL)supportsAllActions { - return (_supportedWebActions == DZNWebActionAll) ? YES : NO; + return (_supportedWebActions == DKWKWebActionAll) ? YES : NO; } @@ -460,7 +462,7 @@ - (void)setURL:(NSURL *)URL - (void)setTitle:(NSString *)title { - if (self.webNavigationPrompt == DZNWebNavigationPromptNone) { + if (self.webNavigationPrompt == DKWKWebNavigationPromptNone) { [super setTitle:title]; return; } @@ -527,7 +529,7 @@ - (void)setLoadingError:(NSError *)error - (BOOL)showNavigationPromptTitle { - if ((self.webNavigationPrompt & DZNWebNavigationPromptTitle) > 0 || self.webNavigationPrompt == DZNWebNavigationPromptAll) { + if ((self.webNavigationPrompt & DKWKWebNavigationPromptTitle) > 0 || self.webNavigationPrompt == DKWKWebNavigationPromptAll) { return YES; } return NO; @@ -535,14 +537,14 @@ - (BOOL)showNavigationPromptTitle - (BOOL)showNavigationPromptURL { - if ((self.webNavigationPrompt & DZNWebNavigationPromptURL) > 0 || self.webNavigationPrompt == DZNWebNavigationPromptAll) { + if ((self.webNavigationPrompt & DKWKWebNavigationPromptURL) > 0 || self.webNavigationPrompt == DKWKWebNavigationPromptAll) { return YES; } return NO; } -#pragma mark - DZNWebViewController methods +#pragma mark - DKWKWebViewController methods - (void)loadURL:(NSURL *)URL { @@ -595,7 +597,7 @@ - (void)showBackwardHistory:(UIGestureRecognizer *)sender return; } - [self presentHistoryControllerForTool:DZNWebNavigationToolBackward fromView:sender.view]; + [self presentHistoryControllerForTool:DKWKWebNavigationToolBackward fromView:sender.view]; } - (void)showForwardHistory:(UIGestureRecognizer *)sender @@ -604,10 +606,10 @@ - (void)showForwardHistory:(UIGestureRecognizer *)sender return; } - [self presentHistoryControllerForTool:DZNWebNavigationToolForward fromView:sender.view]; + [self presentHistoryControllerForTool:DKWKWebNavigationToolForward fromView:sender.view]; } -- (void)presentHistoryControllerForTool:(DZNWebNavigationTools)tool fromView:(UIView *)view +- (void)presentHistoryControllerForTool:(DKWKWebNavigationTools)tool fromView:(UIView *)view { UITableViewController *controller = [UITableViewController new]; controller.title = @"历史纪录"; @@ -617,9 +619,9 @@ - (void)presentHistoryControllerForTool:(DZNWebNavigationTools)tool fromView:(UI controller.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismissHistoryController)]; UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:controller]; - UIView *bar = DZN_IS_IPAD ? self.navigationBar : self.toolbar; + UIView *bar = DK_IS_IPAD ? self.navigationBar : self.toolbar; - if (DZN_IS_IPAD) { + if (DK_IS_IPAD) { UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:navigationController]; [popover presentPopoverFromRect:view.frame inView:bar permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; } @@ -630,7 +632,7 @@ - (void)presentHistoryControllerForTool:(DZNWebNavigationTools)tool fromView:(UI - (void)configureToolBars { - if (DZN_IS_IPAD) { + if (DK_IS_IPAD) { self.navigationItem.rightBarButtonItems = [[[self navigationToolItems] reverseObjectEnumerator] allObjects]; } else { @@ -650,12 +652,12 @@ - (void)configureToolBars self.navigationController.hidesBarsWhenVerticallyCompact = self.hideBarsWithGestures; if (self.hideBarsWithGestures) { - [self.navigationBar addObserver:self forKeyPath:@"hidden" options:NSKeyValueObservingOptionNew context:&DZNWebViewControllerKVOContext]; - [self.navigationBar addObserver:self forKeyPath:@"center" options:NSKeyValueObservingOptionNew context:&DZNWebViewControllerKVOContext]; - [self.navigationBar addObserver:self forKeyPath:@"alpha" options:NSKeyValueObservingOptionNew context:&DZNWebViewControllerKVOContext]; + [self.navigationBar addObserver:self forKeyPath:@"hidden" options:NSKeyValueObservingOptionNew context:&DKWKWebViewControllerKVOContext]; + [self.navigationBar addObserver:self forKeyPath:@"center" options:NSKeyValueObservingOptionNew context:&DKWKWebViewControllerKVOContext]; + [self.navigationBar addObserver:self forKeyPath:@"alpha" options:NSKeyValueObservingOptionNew context:&DKWKWebViewControllerKVOContext]; } - if (!DZN_IS_IPAD && self.navigationController.toolbarHidden && self.toolbarItems.count > 0) { + if (!DK_IS_IPAD && self.navigationController.toolbarHidden && self.toolbarItems.count > 0) { [self.navigationController setToolbarHidden:NO]; } } @@ -711,7 +713,7 @@ - (void)presentActivityController:(id)sender // [self presentActivityControllerWithItem:self.webView.URL.absoluteString andTitle:self.webView.title sender:sender]; if (NSClassFromString(@"UIPresentationController")) { - NSArray *browserActivities = @[[TOActivitySafari new]]; + NSArray *browserActivities = @[[DKActivitySafari new]]; UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[self.webView.URL] applicationActivities:browserActivities]; activityViewController.modalPresentationStyle = UIModalPresentationPopover; activityViewController.popoverPresentationController.barButtonItem = sender; @@ -766,19 +768,19 @@ - (void)destroyProgressViewIfNeeded } -#pragma mark - DZNNavigationDelegate methods +#pragma mark - DKNavigationDelegate methods -- (void)webView:(DZNWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation +- (void)webView:(DKWKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation { [self updateStateBarItem]; } -- (void)webView:(DZNWebView *)webView didCommitNavigation:(WKNavigation *)navigation +- (void)webView:(DKWKWebView *)webView didCommitNavigation:(WKNavigation *)navigation { [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:[self.webView isLoading]]; } -- (void)webView:(DZNWebView *)webView didUpdateProgress:(CGFloat)progress +- (void)webView:(DKWKWebView *)webView didUpdateProgress:(CGFloat)progress { if (!self.showLoadingProgress) { [self destroyProgressViewIfNeeded]; @@ -805,14 +807,14 @@ - (void)webView:(DZNWebView *)webView didUpdateProgress:(CGFloat)progress [self.progressView setProgress:progress animated:YES]; } -- (void)webView:(DZNWebView *)webView didFinishNavigation:(WKNavigation *)navigation +- (void)webView:(DKWKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { - if (self.webNavigationPrompt > DZNWebNavigationPromptNone) { + if (self.webNavigationPrompt > DKWKWebNavigationPromptNone) { self.title = self.webView.title; } } -- (void)webView:(DZNWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error +- (void)webView:(DKWKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error { [self setLoadingError:error]; @@ -827,7 +829,7 @@ - (void)webView:(DZNWebView *)webView didFailNavigation:(WKNavigation *)navigati #pragma mark - WKUIDelegate methods -- (DZNWebView *)webView:(DZNWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures +- (DKWKWebView *)webView:(DKWKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures { if (!navigationAction.targetFrame.isMainFrame) { [webView loadRequest:navigationAction.request]; @@ -846,10 +848,10 @@ - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - if (tableView.tag == DZNWebNavigationToolBackward) { + if (tableView.tag == DKWKWebNavigationToolBackward) { return self.webView.backForwardList.backList.count; } - if (tableView.tag == DZNWebNavigationToolForward) { + if (tableView.tag == DKWKWebNavigationToolForward) { return self.webView.backForwardList.forwardList.count; } return 0; @@ -866,10 +868,10 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N WKBackForwardListItem *item = nil; - if (tableView.tag == DZNWebNavigationToolBackward) { + if (tableView.tag == DKWKWebNavigationToolBackward) { item = [self.webView.backForwardList.backList objectAtIndex:indexPath.row]; } - if (tableView.tag == DZNWebNavigationToolForward) { + if (tableView.tag == DKWKWebNavigationToolForward) { item = [self.webView.backForwardList.forwardList objectAtIndex:indexPath.row]; } @@ -891,10 +893,10 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath { WKBackForwardListItem *item = nil; - if (tableView.tag == DZNWebNavigationToolBackward) { + if (tableView.tag == DKWKWebNavigationToolBackward) { item = [self.webView.backForwardList.backList objectAtIndex:indexPath.row]; } - if (tableView.tag == DZNWebNavigationToolForward) { + if (tableView.tag == DKWKWebNavigationToolForward) { item = [self.webView.backForwardList.forwardList objectAtIndex:indexPath.row]; } @@ -908,7 +910,7 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { - if (context != &DZNWebViewControllerKVOContext) { + if (context != &DKWKWebViewControllerKVOContext) { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; return; } @@ -916,7 +918,7 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N if ([object isEqual:self.navigationBar]) { // Skips for landscape orientation, since there is no status bar visible on iPhone landscape - if (DZN_IS_LANDSCAPE) { + if (DK_IS_LANDSCAPE) { return; } @@ -939,7 +941,7 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N center.y = -2.0; self.navigationBar.center = center; - [UIView beginAnimations:@"DZNNavigationBarAnimation" context:nil]; + [UIView beginAnimations:@"DKNavigationBarAnimation" context:nil]; for (UIView *subview in self.navigationBar.subviews) { if (subview != self.navigationBar.subviews[0]) { @@ -990,11 +992,11 @@ - (void)viewDidUnload - (void)dealloc { if (self.hideBarsWithGestures) { - [self.navigationBar removeObserver:self forKeyPath:@"hidden" context:&DZNWebViewControllerKVOContext]; - [self.navigationBar removeObserver:self forKeyPath:@"center" context:&DZNWebViewControllerKVOContext]; - [self.navigationBar removeObserver:self forKeyPath:@"alpha" context:&DZNWebViewControllerKVOContext]; + [self.navigationBar removeObserver:self forKeyPath:@"hidden" context:&DKWKWebViewControllerKVOContext]; + [self.navigationBar removeObserver:self forKeyPath:@"center" context:&DKWKWebViewControllerKVOContext]; + [self.navigationBar removeObserver:self forKeyPath:@"alpha" context:&DKWKWebViewControllerKVOContext]; } - [self.webView removeObserver:self forKeyPath:@"loading" context:&DZNWebViewControllerKVOContext]; + [self.webView removeObserver:self forKeyPath:@"loading" context:&DKWKWebViewControllerKVOContext]; _backwardBarItem = nil; _forwardBarItem = nil; diff --git a/webViewCompatible/webViewCompatible/DKWebView/DKWebView.h b/webViewCompatible/webViewCompatible/DKWebView/DKWebView.h new file mode 100644 index 0000000..02453de --- /dev/null +++ b/webViewCompatible/webViewCompatible/DKWebView/DKWebView.h @@ -0,0 +1,22 @@ +// +// DKWebView.h +// DKWebView +// +// Created by alldk on 2017/8/9. +// Copyright © 2017年 alldk. All rights reserved. +// + +#import + +//! Project version number for DKWebView. +FOUNDATION_EXPORT double DKWebViewVersionNumber; + +//! Project version string for DKWebView. +FOUNDATION_EXPORT const unsigned char DKWebViewVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import +#ifdef __OBJC__ + +#endif + + diff --git a/webViewCompatible/webViewCompatible/DKWebView/Info.plist b/webViewCompatible/webViewCompatible/DKWebView/Info.plist new file mode 100644 index 0000000..f32c333 --- /dev/null +++ b/webViewCompatible/webViewCompatible/DKWebView/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + zh_CN + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/webViewCompatible/webViewCompatible/DKWebView/NJKWebViewProgress/DKWebViewProgress.h b/webViewCompatible/webViewCompatible/DKWebView/NJKWebViewProgress/DKWebViewProgress.h new file mode 100755 index 0000000..a5694c5 --- /dev/null +++ b/webViewCompatible/webViewCompatible/DKWebView/NJKWebViewProgress/DKWebViewProgress.h @@ -0,0 +1,36 @@ +// +// DKWebViewProgress.h +// +// Created by Satoshi Aasano on 4/20/13. +// Copyright (c) 2013 Satoshi Asano. All rights reserved. +// + +#import +#import + +#undef DK_weak +#if __has_feature(objc_arc_weak) +#define DK_weak weak +#else +#define DK_weak unsafe_unretained +#endif + +extern const float DKInitialProgressValue; +extern const float DKInteractiveProgressValue; +extern const float DKFinalProgressValue; + +typedef void (^DKWebViewProgressBlock)(float progress); +@protocol DKWebViewProgressDelegate; +@interface DKWebViewProgress : NSObject +@property (nonatomic, DK_weak) idprogressDelegate; +@property (nonatomic, DK_weak) idwebViewProxyDelegate; +@property (nonatomic, copy) DKWebViewProgressBlock progressBlock; +@property (nonatomic, readonly) float progress; // 0.0..1.0 + +- (void)reset; +@end + +@protocol DKWebViewProgressDelegate +- (void)webViewProgress:(DKWebViewProgress *)webViewProgress updateProgress:(float)progress; +@end + diff --git a/TO/TOWebViewController/NJKWebViewProgress/NJKWebViewProgress.m b/webViewCompatible/webViewCompatible/DKWebView/NJKWebViewProgress/DKWebViewProgress.m similarity index 92% rename from TO/TOWebViewController/NJKWebViewProgress/NJKWebViewProgress.m rename to webViewCompatible/webViewCompatible/DKWebView/NJKWebViewProgress/DKWebViewProgress.m index 4b9baa6..7dd06bc 100755 --- a/TO/TOWebViewController/NJKWebViewProgress/NJKWebViewProgress.m +++ b/webViewCompatible/webViewCompatible/DKWebView/NJKWebViewProgress/DKWebViewProgress.m @@ -1,19 +1,19 @@ // -// NJKWebViewProgress.m +// DKWebViewProgress.m // // Created by Satoshi Aasano on 4/20/13. // Copyright (c) 2013 Satoshi Asano. All rights reserved. // -#import "NJKWebViewProgress.h" +#import "DKWebViewProgress.h" -NSString *completeRPCURLPath = @"/njkwebviewprogressproxy/complete"; +NSString *completeRPCURLPath = @"/DKwebviewprogressproxy/complete"; -const float NJKInitialProgressValue = 0.1f; -const float NJKInteractiveProgressValue = 0.5f; -const float NJKFinalProgressValue = 0.9f; +const float DKInitialProgressValue = 0.1f; +const float DKInteractiveProgressValue = 0.5f; +const float DKFinalProgressValue = 0.9f; -@implementation NJKWebViewProgress +@implementation DKWebViewProgress { NSUInteger _loadingCount; NSUInteger _maxLoadCount; @@ -33,15 +33,15 @@ - (id)init - (void)startProgress { - if (_progress < NJKInitialProgressValue) { - [self setProgress:NJKInitialProgressValue]; + if (_progress < DKInitialProgressValue) { + [self setProgress:DKInitialProgressValue]; } } - (void)incrementProgress { float progress = self.progress; - float maxProgress = _interactive ? NJKFinalProgressValue : NJKInteractiveProgressValue; + float maxProgress = _interactive ? DKFinalProgressValue : DKInteractiveProgressValue; float remainPercent = (float)_loadingCount / (float)_maxLoadCount; float increment = (maxProgress - progress) * remainPercent; progress += increment; diff --git a/TO/TOWebViewController/NJKWebViewProgress/NJKWebViewProgressView.h b/webViewCompatible/webViewCompatible/DKWebView/NJKWebViewProgress/DKWebViewProgressView.h similarity index 88% rename from TO/TOWebViewController/NJKWebViewProgress/NJKWebViewProgressView.h rename to webViewCompatible/webViewCompatible/DKWebView/NJKWebViewProgress/DKWebViewProgressView.h index 0f7a2ad..cd4fc83 100755 --- a/TO/TOWebViewController/NJKWebViewProgress/NJKWebViewProgressView.h +++ b/webViewCompatible/webViewCompatible/DKWebView/NJKWebViewProgress/DKWebViewProgressView.h @@ -1,5 +1,5 @@ // -// NJKWebViewProgressView.h +// DKWebViewProgressView.h // iOS 7 Style WebView Progress Bar // // Created by Satoshi Aasano on 11/16/13. @@ -8,7 +8,7 @@ #import -@interface NJKWebViewProgressView : UIView +@interface DKWebViewProgressView : UIView @property (nonatomic) float progress; @property (nonatomic) UIView *progressBarView; diff --git a/TO/TOWebViewController/NJKWebViewProgress/NJKWebViewProgressView.m b/webViewCompatible/webViewCompatible/DKWebView/NJKWebViewProgress/DKWebViewProgressView.m similarity index 95% rename from TO/TOWebViewController/NJKWebViewProgress/NJKWebViewProgressView.m rename to webViewCompatible/webViewCompatible/DKWebView/NJKWebViewProgress/DKWebViewProgressView.m index bf9fe67..73c75b2 100755 --- a/TO/TOWebViewController/NJKWebViewProgress/NJKWebViewProgressView.m +++ b/webViewCompatible/webViewCompatible/DKWebView/NJKWebViewProgress/DKWebViewProgressView.m @@ -1,13 +1,13 @@ // -// NJKWebViewProgressView.m +// DKWebViewProgressView.m // // Created by Satoshi Aasanoon 11/16/13. // Copyright (c) 2013 Satoshi Asano. All rights reserved. // -#import "NJKWebViewProgressView.h" +#import "DKWebViewProgressView.h" -@implementation NJKWebViewProgressView +@implementation DKWebViewProgressView - (id)initWithFrame:(CGRect)frame { diff --git a/webViewCompatible/webViewCompatible/DKWebView/ReadMe.txt b/webViewCompatible/webViewCompatible/DKWebView/ReadMe.txt new file mode 100644 index 0000000..a52cde2 --- /dev/null +++ b/webViewCompatible/webViewCompatible/DKWebView/ReadMe.txt @@ -0,0 +1,20 @@ +/* lzy注170809: +网络组件组合自: +UIWebView:https://github.com/TimOliver/TOWebViewController/releases/tag/2.2.6 +简化和分析该类库在:https://github.com/github641/TOWebViewController +WKWebView:https://github.com/dzenbot/DZNWebViewController/releases/tag/v3.2 +简化该类库在:https://github.com/github641/DZNWebViewController + +SFSafariViewController使用简单,直接使用原生的。 + +集成的过程在:https://github.com/github641/WebViewCompatible + +修改而来,向开源致敬。 +二、修改内容如下: +1、文件名、类名、带默认前缀的其他变量、方法名称等 +2、`通知`的名称修改 +3、线程、队列的创建标识 + +使用此类库,需要导入WebKit + +*/ diff --git a/TO/TOWebViewController/UIImage+TOWebViewControllerIcons.h b/webViewCompatible/webViewCompatible/DKWebView/UIImage+DKWebViewControllerIcons.h similarity index 72% rename from TO/TOWebViewController/UIImage+TOWebViewControllerIcons.h rename to webViewCompatible/webViewCompatible/DKWebView/UIImage+DKWebViewControllerIcons.h index b6fc9d3..e1e69cd 100644 --- a/TO/TOWebViewController/UIImage+TOWebViewControllerIcons.h +++ b/webViewCompatible/webViewCompatible/DKWebView/UIImage+DKWebViewControllerIcons.h @@ -1,5 +1,5 @@ // -// UIImage+TOWebViewControllerIcons.h +// UIImage+DKWebViewControllerIcons.h // // Copyright 2013-2016 Timothy Oliver. All rights reserved. // @@ -23,16 +23,16 @@ #import /* Keys for each of the theming properties */ -extern const NSString *TOWebViewControllerButtonTintColor; -extern const NSString *TOWebViewControllerButtonBevelOpacity; +extern const NSString *DKWebViewControllerButtonTintColor; +extern const NSString *DKWebViewControllerButtonBevelOpacity; -@interface UIImage (TOWebViewControllerIcons) +@interface UIImage (DKWebViewControllerIcons) /* Navigation Buttons */ -+ (instancetype)TOWebViewControllerIcon_backButtonWithAttributes:(NSDictionary *)attributes; -+ (instancetype)TOWebViewControllerIcon_forwardButtonWithAttributes:(NSDictionary *)attributes; -+ (instancetype)TOWebViewControllerIcon_refreshButtonWithAttributes:(NSDictionary *)attributes; -+ (instancetype)TOWebViewControllerIcon_stopButtonWithAttributes:(NSDictionary *)attributes; -+ (instancetype)TOWebViewControllerIcon_actionButtonWithAttributes:(NSDictionary *)attributes; ++ (instancetype)DKWebViewControllerIcon_backButtonWithAttributes:(NSDictionary *)attributes; ++ (instancetype)DKWebViewControllerIcon_forwardButtonWithAttributes:(NSDictionary *)attributes; ++ (instancetype)DKWebViewControllerIcon_refreshButtonWithAttributes:(NSDictionary *)attributes; ++ (instancetype)DKWebViewControllerIcon_stopButtonWithAttributes:(NSDictionary *)attributes; ++ (instancetype)DKWebViewControllerIcon_actionButtonWithAttributes:(NSDictionary *)attributes; @end diff --git a/TO/TOWebViewController/UIImage+TOWebViewControllerIcons.m b/webViewCompatible/webViewCompatible/DKWebView/UIImage+DKWebViewControllerIcons.m similarity index 97% rename from TO/TOWebViewController/UIImage+TOWebViewControllerIcons.m rename to webViewCompatible/webViewCompatible/DKWebView/UIImage+DKWebViewControllerIcons.m index bc38730..7b063f1 100644 --- a/TO/TOWebViewController/UIImage+TOWebViewControllerIcons.m +++ b/webViewCompatible/webViewCompatible/DKWebView/UIImage+DKWebViewControllerIcons.m @@ -1,5 +1,5 @@ // -// UIImage+TOWebViewControllerIcons.m +// UIImage+DKWebViewControllerIcons.m // // Copyright 2013-2016 Timothy Oliver. All rights reserved. // @@ -21,10 +21,10 @@ // IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -#import "UIImage+TOWebViewControllerIcons.h" +#import "UIImage+DKWebViewControllerIcons.h" -const NSString *TOWebViewControllerButtonTintColor = @"TOWebViewControllerButtonFillColor"; -const NSString *TOWebViewControllerButtonBevelOpacity = @"TOWebViewControllerButtonBevelOpacity"; +const NSString *DKWebViewControllerButtonTintColor = @"DKWebViewControllerButtonFillColor"; +const NSString *DKWebViewControllerButtonBevelOpacity = @"DKWebViewControllerButtonBevelOpacity"; /* Default iOS 6 Theming Properties */ #define DEFAULT_IPHONE_BUTTON_TINT [UIColor colorWithRed:1.0f green:1.0f blue:1.0f alpha:1.0f] @@ -50,12 +50,12 @@ + (void)drawBevelFromFillColor:(UIColor *)fillColor opacity:(CGFloat)opacity; @end -@implementation UIImage (TOWebViewControllerIcons) +@implementation UIImage (DKWebViewControllerIcons) #pragma mark - Private Methods - + (UIColor *)fillColorFromAttributes:(NSDictionary *)attributes { - UIColor *fillColor = attributes[TOWebViewControllerButtonTintColor]; + UIColor *fillColor = attributes[DKWebViewControllerButtonTintColor]; if (fillColor == nil) { if (IPAD) fillColor = DEFAULT_IPAD_BUTTON_TINT; @@ -68,7 +68,7 @@ + (UIColor *)fillColorFromAttributes:(NSDictionary *)attributes + (CGFloat)bevelOpacityFromAttributes:(NSDictionary *)attributes { - NSNumber *opacityNumber = attributes[TOWebViewControllerButtonBevelOpacity]; + NSNumber *opacityNumber = attributes[DKWebViewControllerButtonBevelOpacity]; if (opacityNumber == nil) { if (IPAD) return DEFAULT_IPAD_BEVEL_OPACITY; @@ -108,7 +108,7 @@ + (void)drawBevelFromFillColor:(UIColor *)fillColor opacity:(CGFloat)opacity } #pragma mark - Navigation Buttons - -+ (instancetype)TOWebViewControllerIcon_backButtonWithAttributes:(NSDictionary *)attributes ++ (instancetype)DKWebViewControllerIcon_backButtonWithAttributes:(NSDictionary *)attributes { UIImage *backButtonImage = nil; if (MINIMAL_UI) { @@ -163,7 +163,7 @@ + (instancetype)TOWebViewControllerIcon_backButtonWithAttributes:(NSDictionary * return backButtonImage; } -+ (instancetype)TOWebViewControllerIcon_forwardButtonWithAttributes:(NSDictionary *)attributes ++ (instancetype)DKWebViewControllerIcon_forwardButtonWithAttributes:(NSDictionary *)attributes { UIImage *forwardButtonImage = nil; if (MINIMAL_UI) { @@ -218,7 +218,7 @@ + (instancetype)TOWebViewControllerIcon_forwardButtonWithAttributes:(NSDictionar return forwardButtonImage; } -+ (instancetype)TOWebViewControllerIcon_refreshButtonWithAttributes:(NSDictionary *)attributes ++ (instancetype)DKWebViewControllerIcon_refreshButtonWithAttributes:(NSDictionary *)attributes { UIImage *refreshButtonImage = nil; if (MINIMAL_UI) { @@ -289,7 +289,7 @@ + (instancetype)TOWebViewControllerIcon_refreshButtonWithAttributes:(NSDictionar return refreshButtonImage; } -+ (instancetype)TOWebViewControllerIcon_stopButtonWithAttributes:(NSDictionary *)attributes ++ (instancetype)DKWebViewControllerIcon_stopButtonWithAttributes:(NSDictionary *)attributes { UIImage *stopButtonImage = nil; if (MINIMAL_UI) { @@ -359,7 +359,7 @@ + (instancetype)TOWebViewControllerIcon_stopButtonWithAttributes:(NSDictionary * return stopButtonImage; } -+ (instancetype)TOWebViewControllerIcon_actionButtonWithAttributes:(NSDictionary *)attributes ++ (instancetype)DKWebViewControllerIcon_actionButtonWithAttributes:(NSDictionary *)attributes { UIImage *actionButtonImage = nil; if (MINIMAL_UI) { diff --git a/webViewCompatible/webViewCompatible/WebviewCompatibleTool.h b/webViewCompatible/webViewCompatible/DKWebView/WebviewCompatibleTool.h similarity index 100% rename from webViewCompatible/webViewCompatible/WebviewCompatibleTool.h rename to webViewCompatible/webViewCompatible/DKWebView/WebviewCompatibleTool.h diff --git a/webViewCompatible/webViewCompatible/WebviewCompatibleTool.m b/webViewCompatible/webViewCompatible/DKWebView/WebviewCompatibleTool.m similarity index 74% rename from webViewCompatible/webViewCompatible/WebviewCompatibleTool.m rename to webViewCompatible/webViewCompatible/DKWebView/WebviewCompatibleTool.m index 1a4a9a4..3fc0c9d 100644 --- a/webViewCompatible/webViewCompatible/WebviewCompatibleTool.m +++ b/webViewCompatible/webViewCompatible/DKWebView/WebviewCompatibleTool.m @@ -7,12 +7,12 @@ // #import "WebviewCompatibleTool.h" -#import "TOWebViewController.h" -#import "DZNWebViewController.h" +#import "DKUIWebViewController.h" +#import "DKWKWebViewController.h" #import -#import "Macro.h" +#define SV_GREATER_THAN_OR_EQUAL_TO(v)([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) @interface NSString(DK) - (BOOL)isNotBlank; @@ -45,13 +45,14 @@ + (void)from:(UIViewController *)from toWebBrowserWithPush:(BOOL)isPush url:(NSS UIViewController *vc; - if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")) { + if (SV_GREATER_THAN_OR_EQUAL_TO(@"9.0")) { vc = [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:url]]; - }else if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")){//WKWebView + }else if (SV_GREATER_THAN_OR_EQUAL_TO(@"8.0")){//WKWebView // DZNWebViewController处理 - DZNWebViewController *tovc = [[DZNWebViewController alloc] initWithURL:[NSURL URLWithString:url]]; +// DKWKWebViewController *tovc = [[DKWKWebViewController alloc] initWithURL:[NSURL URLWithString:url] tab:NO]; + DKUIWebViewController *tovc = [[DKUIWebViewController alloc] initWithURLString:url]; if (isPush) { @@ -64,7 +65,7 @@ + (void)from:(UIViewController *)from toWebBrowserWithPush:(BOOL)isPush url:(NSS }else{//UIWebView // TOWebViewController的处理 - TOWebViewController *tovc = [[TOWebViewController alloc] initWithURLString:url]; + DKUIWebViewController *tovc = [[DKUIWebViewController alloc] initWithURLString:url]; if (isPush) { vc = tovc; diff --git a/webViewCompatible/webViewCompatible/ViewController.m b/webViewCompatible/webViewCompatible/ViewController.m index 971cae4..bdc673e 100644 --- a/webViewCompatible/webViewCompatible/ViewController.m +++ b/webViewCompatible/webViewCompatible/ViewController.m @@ -11,10 +11,10 @@ #import #import "WebviewCompatibleTool.h" -#import "TOWebViewController.h" -#import "DZNWebViewController.h" +#import "DKUIWebViewController.h" +#import "DKWKWebViewController.h" -#import "TOActivitySafari.h" +//#import "TOActivitySafari.h" #import "Macro.h" @@ -43,12 +43,12 @@ - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ // 判断,当前显示的控制器是否有 navi管理:有则push,无则present -// [WebviewCompatibleTool from:self toWebBrowserWithPush:NO url:s]; + [WebviewCompatibleTool from:self toWebBrowserWithPush:NO url:s]; - SFSafariViewController *vc = [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:s]]; - [self presentViewController:vc animated:YES completion:nil]; - - vc.delegate = self; +// SFSafariViewController *vc = [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:s]]; +// [self presentViewController:vc animated:YES completion:nil]; +// +// vc.delegate = self; } @@ -59,12 +59,12 @@ - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ @param title the title of the web page. @result Returns an array of UIActivity instances that will be appended to UIActivityViewController. */ -- (NSArray *)safariViewController:(SFSafariViewController *)controller activityItemsForURL:(NSURL *)URL title:(nullable NSString *)title{ - NSLog(@"%s url:%@ title:%@", __func__, URL, title); - - return @[[TOActivitySafari new]]; - -} +//- (NSArray *)safariViewController:(SFSafariViewController *)controller activityItemsForURL:(NSURL *)URL title:(nullable NSString *)title{ +// NSLog(@"%s url:%@ title:%@", __func__, URL, title); +// +// return @[[DKActivitySafari new]]; +// +//} /*! @abstract Delegate callback called when the user taps the Done button. Upon this call, the view controller is dismissed modally. */ - (void)safariViewControllerDidFinish:(SFSafariViewController *)controller{