From f2834f29d767b0edad39fe36df180e625030088a Mon Sep 17 00:00:00 2001 From: "Andrew W. Donoho" Date: Mon, 25 Nov 2013 23:41:15 -0600 Subject: [PATCH 01/18] A self.self slipped into the code. A self.self slipped into the code. This introduced some anomalous behavior to this new user of the class. Removing the redundant selfs returned to the expected bahvior of the buttons. --- SVWebViewController/SVWebViewController.m | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/SVWebViewController/SVWebViewController.m b/SVWebViewController/SVWebViewController.m index 2e08ebc..98f2cdd 100644 --- a/SVWebViewController/SVWebViewController.m +++ b/SVWebViewController/SVWebViewController.m @@ -172,11 +172,11 @@ - (UIBarButtonItem *)actionBarButtonItem { #pragma mark - Toolbar - (void)updateToolbarItems { - self.backBarButtonItem.enabled = self.self.webView.canGoBack; - self.forwardBarButtonItem.enabled = self.self.webView.canGoForward; - self.actionBarButtonItem.enabled = !self.self.webView.isLoading; + self.backBarButtonItem.enabled = self.webView.canGoBack; + self.forwardBarButtonItem.enabled = self.webView.canGoForward; + self.actionBarButtonItem.enabled = !self.webView.isLoading; - UIBarButtonItem *refreshStopBarButtonItem = self.self.webView.isLoading ? self.stopBarButtonItem : self.refreshBarButtonItem; + UIBarButtonItem *refreshStopBarButtonItem = self.webView.isLoading ? self.stopBarButtonItem : self.refreshBarButtonItem; UIBarButtonItem *fixedSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil]; UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; @@ -264,7 +264,7 @@ - (void)stopClicked:(UIBarButtonItem *)sender { - (void)actionButtonClicked:(id)sender { NSArray *activities = @[[SVWebViewControllerActivitySafari new], [SVWebViewControllerActivityChrome new]]; - UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:@[self.self.webView.request.URL] applicationActivities:activities]; + UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:@[self.webView.request.URL] applicationActivities:activities]; [self presentViewController:activityController animated:YES completion:nil]; } From 72126c6d9c19e3c10efc3c342966588d95b7bfc9 Mon Sep 17 00:00:00 2001 From: "Andrew W. Donoho" Date: Mon, 2 Dec 2013 09:35:25 -0600 Subject: [PATCH 02/18] End loading by loading about:blank. --- SVWebViewController/SVWebViewController.m | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/SVWebViewController/SVWebViewController.m b/SVWebViewController/SVWebViewController.m index 98f2cdd..cad2807 100644 --- a/SVWebViewController/SVWebViewController.m +++ b/SVWebViewController/SVWebViewController.m @@ -41,7 +41,10 @@ @implementation SVWebViewController #pragma mark - Initialization - (void)dealloc { - [self.webView stopLoading]; +// [self.webView stopLoading]; + [self.webView loadRequest: + [NSURLRequest requestWithURL: + [NSURL URLWithString: @"about:blank"]]]; [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; self.webView.delegate = nil; } @@ -269,6 +272,10 @@ - (void)actionButtonClicked:(id)sender { } - (void)doneButtonClicked:(id)sender { + [self.webView loadRequest: + [NSURLRequest requestWithURL: + [NSURL URLWithString: @"about:blank"]]]; + [self dismissViewControllerAnimated:YES completion:NULL]; } From 54fdfbc3c2252ca28c67c215abf65875fc63a84c Mon Sep 17 00:00:00 2001 From: "Andrew W. Donoho" Date: Mon, 9 Dec 2013 16:57:15 -0600 Subject: [PATCH 03/18] Fix activity indicator counts and support delegating the webView and view controllers events. --- SVWebViewController/SVWebViewController.h | 15 +++ SVWebViewController/SVWebViewController.m | 132 +++++++++++++++++----- 2 files changed, 121 insertions(+), 26 deletions(-) diff --git a/SVWebViewController/SVWebViewController.h b/SVWebViewController/SVWebViewController.h index 42e9dfe..6dbb254 100644 --- a/SVWebViewController/SVWebViewController.h +++ b/SVWebViewController/SVWebViewController.h @@ -8,8 +8,23 @@ #import "SVModalWebViewController.h" +@protocol SVWebViewControllerDelegate + +@optional + +- (void) webViewControllerWillAppear: (SVWebViewController *) wvc; +- (void) webViewControllerDidAppear: (SVWebViewController *) wvc; + +- (void) webViewControllerWillDisappear: (SVWebViewController *) wvc; +- (void) webViewControllerDidDisappear: (SVWebViewController *) wvc; + +@end + @interface SVWebViewController : UIViewController +@property (nonatomic, strong) UIWebView *webView; +@property (weak, nonatomic) id delegate; + - (id)initWithAddress:(NSString*)urlString; - (id)initWithURL:(NSURL*)URL; diff --git a/SVWebViewController/SVWebViewController.m b/SVWebViewController/SVWebViewController.m index cad2807..ae41990 100644 --- a/SVWebViewController/SVWebViewController.m +++ b/SVWebViewController/SVWebViewController.m @@ -18,9 +18,10 @@ @interface SVWebViewController () @property (nonatomic, strong) UIBarButtonItem *stopBarButtonItem; @property (nonatomic, strong) UIBarButtonItem *actionBarButtonItem; -@property (nonatomic, strong) UIWebView *webView; @property (nonatomic, strong) NSURL *URL; +@property (nonatomic) NSUInteger webViewLoads; + - (id)initWithAddress:(NSString*)urlString; - (id)initWithURL:(NSURL*)URL; - (void)loadURL:(NSURL*)URL; @@ -41,12 +42,22 @@ @implementation SVWebViewController #pragma mark - Initialization - (void)dealloc { -// [self.webView stopLoading]; - [self.webView loadRequest: - [NSURLRequest requestWithURL: - [NSURL URLWithString: @"about:blank"]]]; - [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; - self.webView.delegate = nil; + + UIWebView *wv = self.webView; + + [wv stopLoading]; + + [NSOperationQueue.mainQueue addOperationWithBlock: ^{ + + [wv loadRequest: + [NSURLRequest requestWithURL: [NSURL URLWithString: @"about:blank"]]]; + }]; + if (!self.delegate) { + + [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; + } + wv.delegate = nil; + self.delegate = nil; } - (id)initWithAddress:(NSString *)urlString { @@ -96,6 +107,22 @@ - (void)viewWillAppear:(BOOL)animated { if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { [self.navigationController setToolbarHidden:NO animated:animated]; } + id delegate = self.delegate; + + if ([delegate respondsToSelector: @selector(webViewControllerWillAppear:)]) { + + [delegate webViewControllerWillAppear: self]; + } +} + +- (void)viewDidAppear:(BOOL)animated { + + id delegate = self.delegate; + + if ([delegate respondsToSelector: @selector(webViewControllerDidAppear:)]) { + + [delegate webViewControllerDidAppear: self]; + } } - (void)viewWillDisappear:(BOOL)animated { @@ -104,11 +131,27 @@ - (void)viewWillDisappear:(BOOL)animated { if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { [self.navigationController setToolbarHidden:YES animated:animated]; } + id delegate = self.delegate; + + if ([delegate respondsToSelector: @selector(webViewControllerWillDisappear:)]) { + + [delegate webViewControllerWillDisappear: self]; + } } - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; - [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; + + id delegate = self.delegate; + + if (!delegate) { + + [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; + } + else if ([delegate respondsToSelector: @selector(webViewControllerDidDisappear:)]) { + + [delegate webViewControllerDidDisappear: self]; + } } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { @@ -177,13 +220,13 @@ - (UIBarButtonItem *)actionBarButtonItem { - (void)updateToolbarItems { self.backBarButtonItem.enabled = self.webView.canGoBack; self.forwardBarButtonItem.enabled = self.webView.canGoForward; - self.actionBarButtonItem.enabled = !self.webView.isLoading; - - UIBarButtonItem *refreshStopBarButtonItem = self.webView.isLoading ? self.stopBarButtonItem : self.refreshBarButtonItem; - + self.actionBarButtonItem.enabled = !self.webViewLoads; + + UIBarButtonItem *refreshStopBarButtonItem = self.webViewLoads ? self.stopBarButtonItem : self.refreshBarButtonItem; + UIBarButtonItem *fixedSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil]; UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; - + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { CGFloat toolbarWidth = 250.0f; fixedSpace.width = 35.0f; @@ -198,14 +241,14 @@ - (void)updateToolbarItems { fixedSpace, self.actionBarButtonItem, nil]; - + UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, toolbarWidth, 44.0f)]; toolbar.items = items; toolbar.barStyle = self.navigationController.navigationBar.barStyle; toolbar.tintColor = self.navigationController.navigationBar.tintColor; self.navigationItem.rightBarButtonItems = items.reverseObjectEnumerator.allObjects; } - + else { NSArray *items = [NSArray arrayWithObjects: fixedSpace, @@ -218,7 +261,7 @@ - (void)updateToolbarItems { self.actionBarButtonItem, fixedSpace, nil]; - + self.navigationController.toolbar.barStyle = self.navigationController.navigationBar.barStyle; self.navigationController.toolbar.tintColor = self.navigationController.navigationBar.tintColor; self.toolbarItems = items; @@ -227,22 +270,59 @@ - (void)updateToolbarItems { #pragma mark - UIWebViewDelegate +- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { + + id delegate = self.delegate; + + if ([delegate respondsToSelector: @selector(webView:shouldStartLoadWithRequest:navigationType:)]) { + + return [delegate webView: webView shouldStartLoadWithRequest: request navigationType: navigationType]; + } + return YES; +} + - (void)webViewDidStartLoad:(UIWebView *)webView { - [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; + + self.webViewLoads++; [self updateToolbarItems]; -} + id delegate = self.delegate; + + if ([delegate respondsToSelector: @selector(webViewDidStartLoad:)]) { + + [delegate webViewDidStartLoad: webView]; + } + else { [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; } +} - (void)webViewDidFinishLoad:(UIWebView *)webView { - [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; - + + self.webViewLoads = self.webViewLoads ? --self.webViewLoads : 0; self.navigationItem.title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"]; + [self updateToolbarItems]; + + id delegate = self.delegate; + + if ([delegate respondsToSelector: @selector(webViewDidFinishLoad:)]) { + + [delegate webViewDidFinishLoad: webView]; + } + else { [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; } } - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { - [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; + + self.webViewLoads = self.webViewLoads ? --self.webViewLoads : 0; [self updateToolbarItems]; + + id delegate = self.delegate; + + if ([delegate respondsToSelector: @selector(webView:didFailLoadWithError:)]) { + + [delegate webView: webView didFailLoadWithError: error]; + } + else { [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; } } #pragma mark - Target actions @@ -256,12 +336,15 @@ - (void)goForwardClicked:(UIBarButtonItem *)sender { } - (void)reloadClicked:(UIBarButtonItem *)sender { + self.webViewLoads = 0; [self.webView reload]; + [self updateToolbarItems]; } - (void)stopClicked:(UIBarButtonItem *)sender { + self.webViewLoads = 0; [self.webView stopLoading]; - [self updateToolbarItems]; + [self updateToolbarItems]; } - (void)actionButtonClicked:(id)sender { @@ -272,10 +355,7 @@ - (void)actionButtonClicked:(id)sender { } - (void)doneButtonClicked:(id)sender { - [self.webView loadRequest: - [NSURLRequest requestWithURL: - [NSURL URLWithString: @"about:blank"]]]; - + [self.webView stopLoading]; [self dismissViewControllerAnimated:YES completion:NULL]; } From 3049bb7b7ee202ecfe293e17829c3ce76d48e2b5 Mon Sep 17 00:00:00 2001 From: "Andrew W. Donoho" Date: Tue, 17 Dec 2013 09:00:09 -0600 Subject: [PATCH 04/18] Make a selector constant to defeat a compiler warning about a missing selector. --- SVWebViewController/SVModalWebViewController.m | 2 +- SVWebViewController/SVWebViewController.h | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/SVWebViewController/SVModalWebViewController.m b/SVWebViewController/SVModalWebViewController.m index f801fa2..2e9e2f6 100644 --- a/SVWebViewController/SVModalWebViewController.m +++ b/SVWebViewController/SVModalWebViewController.m @@ -30,7 +30,7 @@ - (id)initWithURL:(NSURL *)URL { if (self = [super initWithRootViewController:self.webViewController]) { UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self.webViewController - action:@selector(doneButtonClicked:)]; + action:kDoneButtonClicked]; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) self.webViewController.navigationItem.leftBarButtonItem = doneButton; diff --git a/SVWebViewController/SVWebViewController.h b/SVWebViewController/SVWebViewController.h index 6dbb254..86c21b4 100644 --- a/SVWebViewController/SVWebViewController.h +++ b/SVWebViewController/SVWebViewController.h @@ -28,4 +28,7 @@ - (id)initWithAddress:(NSString*)urlString; - (id)initWithURL:(NSURL*)URL; +#define kDoneButtonClicked (@selector(doneButtonClicked:)) +- (void) doneButtonClicked: (id) sender; + @end From 4a083af14eaf59836cdadc3886f1a575a68476b1 Mon Sep 17 00:00:00 2001 From: "Andrew W. Donoho" Date: Thu, 26 Jun 2014 19:10:09 -0500 Subject: [PATCH 05/18] Package up for a trip. Sorry the reasons why each patch is made are being merged and forgotten. --- .../SVModalWebViewController.h | 7 +- .../SVModalWebViewController.m | 11 ++ SVWebViewController/SVWebViewController.h | 26 ++-- SVWebViewController/SVWebViewController.m | 137 +++++++++++++----- 4 files changed, 126 insertions(+), 55 deletions(-) diff --git a/SVWebViewController/SVModalWebViewController.h b/SVWebViewController/SVModalWebViewController.h index aa4d84c..b4016bd 100644 --- a/SVWebViewController/SVModalWebViewController.h +++ b/SVWebViewController/SVModalWebViewController.h @@ -8,13 +8,12 @@ #import -@class SVWebViewController; - -@interface SVModalWebViewController : UINavigationController +@interface SVModalWebViewController : UINavigationController - (id)initWithAddress:(NSString*)urlString; - (id)initWithURL:(NSURL *)URL; -@property (nonatomic, strong) UIColor *barsTintColor; +@property (nonatomic) UIColor *barsTintColor; +@property (getter = isBarAttached, nonatomic) BOOL barAttached; @end diff --git a/SVWebViewController/SVModalWebViewController.m b/SVWebViewController/SVModalWebViewController.m index 2e9e2f6..4cd5244 100644 --- a/SVWebViewController/SVModalWebViewController.m +++ b/SVWebViewController/SVModalWebViewController.m @@ -47,4 +47,15 @@ - (void)viewWillAppear:(BOOL)animated { self.navigationBar.tintColor = self.barsTintColor; } + +#pragma mark - UIToolbarDelegate methods. + + +- (UIBarPosition) positionForBar: (id) bar { + + return self.isBarAttached ? UIBarPositionTopAttached : UIBarPositionTop; + +} // -positionForBar: + + @end diff --git a/SVWebViewController/SVWebViewController.h b/SVWebViewController/SVWebViewController.h index 86c21b4..949097b 100644 --- a/SVWebViewController/SVWebViewController.h +++ b/SVWebViewController/SVWebViewController.h @@ -6,19 +6,7 @@ // // https://github.com/samvermette/SVWebViewController -#import "SVModalWebViewController.h" - -@protocol SVWebViewControllerDelegate - -@optional - -- (void) webViewControllerWillAppear: (SVWebViewController *) wvc; -- (void) webViewControllerDidAppear: (SVWebViewController *) wvc; - -- (void) webViewControllerWillDisappear: (SVWebViewController *) wvc; -- (void) webViewControllerDidDisappear: (SVWebViewController *) wvc; - -@end +@protocol SVWebViewControllerDelegate; @interface SVWebViewController : UIViewController @@ -32,3 +20,15 @@ - (void) doneButtonClicked: (id) sender; @end + +@protocol SVWebViewControllerDelegate + +@optional + +- (void) webViewControllerWillAppear: (SVWebViewController *) wvc; +- (void) webViewControllerDidAppear: (SVWebViewController *) wvc; + +- (void) webViewControllerWillDisappear: (SVWebViewController *) wvc; +- (void) webViewControllerDidDisappear: (SVWebViewController *) wvc; + +@end diff --git a/SVWebViewController/SVWebViewController.m b/SVWebViewController/SVWebViewController.m index ae41990..b3f5951 100644 --- a/SVWebViewController/SVWebViewController.m +++ b/SVWebViewController/SVWebViewController.m @@ -79,41 +79,69 @@ - (void)loadURL:(NSURL *)pageURL { #pragma mark - View lifecycle -- (void)loadView { - self.view = self.webView; - [self loadURL:self.URL]; -} +- (void) loadView { + + UIView *view = [UIView.alloc initWithFrame: UIScreen.mainScreen.bounds]; + + view.backgroundColor = UIColor.blackColor; + + self.view = view; + +} // -loadView + +- (void) viewDidLoad { -- (void)viewDidLoad { [super viewDidLoad]; + [self updateToolbarItems]; -} -- (void)viewDidUnload { - [super viewDidUnload]; - self.webView = nil; - _backBarButtonItem = nil; - _forwardBarButtonItem = nil; - _refreshBarButtonItem = nil; - _stopBarButtonItem = nil; - _actionBarButtonItem = nil; -} +} // -viewDidLoad + + +//- (void)viewDidUnload { +// [super viewDidUnload]; +// self.webView = nil; +// _backBarButtonItem = nil; +// _forwardBarButtonItem = nil; +// _refreshBarButtonItem = nil; +// _stopBarButtonItem = nil; +// _actionBarButtonItem = nil; +//} + +- (void) viewWillAppear: (BOOL) animated { -- (void)viewWillAppear:(BOOL)animated { NSAssert(self.navigationController, @"SVWebViewController needs to be contained in a UINavigationController. If you are presenting SVWebViewController modally, use SVModalWebViewController instead."); [super viewWillAppear:animated]; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { - [self.navigationController setToolbarHidden:NO animated:animated]; + [self.navigationController setToolbarHidden: NO animated: animated]; } + self.navigationController.view.backgroundColor = UIColor.clearColor; + + UIWebView *wv = self.webView; + +// CGRect frame = self.view.bounds; +// CGFloat height = self.navigationController.navigationBar.bounds.size.height; +// +// frame.origin.y += height; +// frame.size.height -= height; +// + wv.frame = self.view.bounds; + + [self.view addSubview: wv]; + [self loadURL:self.URL]; + + wv.scrollView.backgroundColor = UIColor.clearColor; + id delegate = self.delegate; if ([delegate respondsToSelector: @selector(webViewControllerWillAppear:)]) { [delegate webViewControllerWillAppear: self]; } -} + +} // -viewWillAppear: - (void)viewDidAppear:(BOOL)animated { @@ -161,16 +189,21 @@ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfa return toInterfaceOrientation != UIInterfaceOrientationPortraitUpsideDown; } + #pragma mark - Getters -- (UIWebView*)webView { + +- (UIWebView *) webView { + if(!_webView) { - _webView = [[UIWebView alloc] initWithFrame:[UIScreen mainScreen].bounds]; + _webView = [UIWebView.alloc initWithFrame: self.view.bounds]; _webView.delegate = self; _webView.scalesPageToFit = YES; } return _webView; -} + +} // -webView + - (UIBarButtonItem *)backBarButtonItem { if (!_backBarButtonItem) { @@ -217,7 +250,9 @@ - (UIBarButtonItem *)actionBarButtonItem { #pragma mark - Toolbar -- (void)updateToolbarItems { + +- (void) updateToolbarItems { + self.backBarButtonItem.enabled = self.webView.canGoBack; self.forwardBarButtonItem.enabled = self.webView.canGoForward; self.actionBarButtonItem.enabled = !self.webViewLoads; @@ -228,7 +263,7 @@ - (void)updateToolbarItems { UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { - CGFloat toolbarWidth = 250.0f; + fixedSpace.width = 35.0f; NSArray *items = [NSArray arrayWithObjects: @@ -241,15 +276,10 @@ - (void)updateToolbarItems { fixedSpace, self.actionBarButtonItem, nil]; - - UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, toolbarWidth, 44.0f)]; - toolbar.items = items; - toolbar.barStyle = self.navigationController.navigationBar.barStyle; - toolbar.tintColor = self.navigationController.navigationBar.tintColor; self.navigationItem.rightBarButtonItems = items.reverseObjectEnumerator.allObjects; } - else { + NSArray *items = [NSArray arrayWithObjects: fixedSpace, self.backBarButtonItem, @@ -261,12 +291,13 @@ - (void)updateToolbarItems { self.actionBarButtonItem, fixedSpace, nil]; - - self.navigationController.toolbar.barStyle = self.navigationController.navigationBar.barStyle; - self.navigationController.toolbar.tintColor = self.navigationController.navigationBar.tintColor; +// self.navigationController.toolbar.barStyle = self.navigationController.navigationBar.barStyle; +// self.navigationController.toolbar.tintColor = self.navigationController.navigationBar.tintColor; self.toolbarItems = items; } -} + +} // -updateToolbarItems + #pragma mark - UIWebViewDelegate @@ -347,12 +378,42 @@ - (void)stopClicked:(UIBarButtonItem *)sender { [self updateToolbarItems]; } -- (void)actionButtonClicked:(id)sender { - NSArray *activities = @[[SVWebViewControllerActivitySafari new], [SVWebViewControllerActivityChrome new]]; +- (void) actionButtonClicked: (UIBarButtonItem *) sender { + + NSArray *activities = @[SVWebViewControllerActivitySafari.new, + SVWebViewControllerActivityChrome.new]; - UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:@[self.webView.request.URL] applicationActivities:activities]; - [self presentViewController:activityController animated:YES completion:nil]; -} + UIActivityViewController *avc = nil; + + avc = [UIActivityViewController.alloc + initWithActivityItems: @[self.webView.request.URL] + applicationActivities:activities]; + + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { + + UIPopoverController *pc = nil; + + pc = [UIPopoverController.alloc initWithContentViewController: avc]; + + pc.popoverContentSize = avc.preferredContentSize; + + [pc presentPopoverFromBarButtonItem: sender + permittedArrowDirections: UIPopoverArrowDirectionAny + animated: YES]; + avc.completionHandler = ^(NSString *activityType, BOOL completed) { + + [pc dismissPopoverAnimated: YES]; + }; + } + else { + + [self.navigationController presentViewController: avc + animated: YES + completion: NULL]; + } + +} // -actionButtonClicked: + - (void)doneButtonClicked:(id)sender { [self.webView stopLoading]; From e9284c4eb80770d6ad39d7be95ffedabe64ba606 Mon Sep 17 00:00:00 2001 From: "Andrew W. Donoho" Date: Tue, 1 Jul 2014 12:01:37 -0500 Subject: [PATCH 06/18] Add the SVWebViewPresenter protocol. --- SVWebViewController/SVWebViewController.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/SVWebViewController/SVWebViewController.h b/SVWebViewController/SVWebViewController.h index 949097b..29fe51c 100644 --- a/SVWebViewController/SVWebViewController.h +++ b/SVWebViewController/SVWebViewController.h @@ -7,11 +7,13 @@ // https://github.com/samvermette/SVWebViewController @protocol SVWebViewControllerDelegate; +@protocol SVWebViewPresenter +@end @interface SVWebViewController : UIViewController -@property (nonatomic, strong) UIWebView *webView; -@property (weak, nonatomic) id delegate; +@property (nonatomic) UIWebView *webView; +@property (weak, nonatomic) id delegate; - (id)initWithAddress:(NSString*)urlString; - (id)initWithURL:(NSURL*)URL; From d5fc4abde172d74407532680e2fdb7c11dcea2ba Mon Sep 17 00:00:00 2001 From: "Andrew W. Donoho" Date: Sat, 2 Aug 2014 14:46:37 -0500 Subject: [PATCH 07/18] Use Google's OpenInChromeController class. This fixed a bug when using https. It also simplified the code and shifted responsibility to Google on how to use their product. --- .../SVWebViewControllerActivityChrome.m | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome.m b/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome.m index f50f68e..9ab87d5 100644 --- a/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome.m +++ b/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome.m @@ -7,32 +7,37 @@ // https://github.com/samvermette/SVWebViewController #import "SVWebViewControllerActivityChrome.h" +#import "OpenInChromeController.h" @implementation SVWebViewControllerActivityChrome -- (NSString *)schemePrefix { - return @"googlechrome://"; -} - - (NSString *)activityTitle { return NSLocalizedStringFromTable(@"Open in Chrome", @"SVWebViewController", nil); } - (BOOL)canPerformWithActivityItems:(NSArray *)activityItems { - for (id activityItem in activityItems) { - if ([activityItem isKindOfClass:[NSURL class]] && [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:self.schemePrefix]]) { - return YES; - } - } + + if ([[OpenInChromeController sharedInstance] isChromeInstalled]) { + + for (NSURL *url in activityItems) { + + if ([url isKindOfClass:[NSURL class]]) { + + NSString *scheme = url.scheme; + + return ([scheme isEqualToString: @"http"] || + [scheme isEqualToString: @"https"]); + } + } + } return NO; } - (void)performActivity { - NSString *openingURL = [self.URLToOpen.absoluteString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; - NSURL *activityURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", self.schemePrefix, openingURL]]; - [[UIApplication sharedApplication] openURL:activityURL]; - - [self activityDidFinish:YES]; + + [[OpenInChromeController sharedInstance] openInChrome: self.URLToOpen]; + + [self activityDidFinish: YES]; } @end From 453f50efbef612b545aa1c1fc3efc543a8d000c9 Mon Sep 17 00:00:00 2001 From: "Andrew W. Donoho" Date: Sat, 2 Aug 2014 14:47:14 -0500 Subject: [PATCH 08/18] Add the OpenInChromeController submodule. --- .gitmodules | 3 +++ SVWebViewController/vendors/OpenInChromeController | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 SVWebViewController/vendors/OpenInChromeController diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..0b5450f --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "SVWebViewController/vendors/OpenInChromeController"] + path = SVWebViewController/vendors/OpenInChromeController + url = https://github.com/GoogleChrome/OpenInChrome.git diff --git a/SVWebViewController/vendors/OpenInChromeController b/SVWebViewController/vendors/OpenInChromeController new file mode 160000 index 0000000..4e139b0 --- /dev/null +++ b/SVWebViewController/vendors/OpenInChromeController @@ -0,0 +1 @@ +Subproject commit 4e139b0253ee99ad9c2d3d0de48a8a36426c1e90 From dcbfd71bd53ea5f9962e0cf79d1c85a3448eba20 Mon Sep 17 00:00:00 2001 From: "Andrew W. Donoho" Date: Sat, 23 Aug 2014 13:27:26 -0500 Subject: [PATCH 09/18] Properly handle an array of activityItems. --- .../SVWebViewControllerActivityChrome.m | 18 ++++++++----- .../SVWebViewControllerActivitySafari.m | 27 +++++++++++++------ 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome.m b/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome.m index 9ab87d5..dab6389 100644 --- a/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome.m +++ b/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome.m @@ -15,29 +15,35 @@ - (NSString *)activityTitle { return NSLocalizedStringFromTable(@"Open in Chrome", @"SVWebViewController", nil); } -- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems { +- (BOOL) canPerformWithActivityItems: (NSArray *) activityItems { if ([[OpenInChromeController sharedInstance] isChromeInstalled]) { + BOOL canPerform = NO; + for (NSURL *url in activityItems) { if ([url isKindOfClass:[NSURL class]]) { NSString *scheme = url.scheme; - return ([scheme isEqualToString: @"http"] || - [scheme isEqualToString: @"https"]); + canPerform |= ([scheme isEqualToString: @"http"] || + [scheme isEqualToString: @"https"]); } } + return canPerform; } return NO; -} -- (void)performActivity { +} // -canPerformWithActivityItems: + + +- (void) performActivity { [[OpenInChromeController sharedInstance] openInChrome: self.URLToOpen]; [self activityDidFinish: YES]; -} + +} // -performActivity @end diff --git a/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari.m b/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari.m index 5235684..afef810 100644 --- a/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari.m +++ b/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari.m @@ -15,14 +15,25 @@ - (NSString *)activityTitle { return NSLocalizedStringFromTable(@"Open in Safari", @"SVWebViewController", nil); } -- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems { - for (id activityItem in activityItems) { - if ([activityItem isKindOfClass:[NSURL class]] && [[UIApplication sharedApplication] canOpenURL:activityItem]) { - return YES; - } - } - return NO; -} +- (BOOL) canPerformWithActivityItems: (NSArray *) activityItems { + + BOOL canPerform = NO; + + for (NSURL *url in activityItems) { + + if ([url isKindOfClass:[NSURL class]]) { + + NSString *scheme = url.scheme; + + canPerform |= (([scheme isEqualToString: @"http"] || + [scheme isEqualToString: @"https"]) && + [[UIApplication sharedApplication] canOpenURL: url]); + } + } + return canPerform; + +} // -canPerformWithActivityItems: + - (void)performActivity { BOOL completed = [[UIApplication sharedApplication] openURL:self.URLToOpen]; From aa2e514d752858947c38ac3f224418008196694b Mon Sep 17 00:00:00 2001 From: "Andrew W. Donoho" Date: Sat, 8 Nov 2014 12:53:12 -0600 Subject: [PATCH 10/18] Force teh web view to display a blank page. This traditionally reduces the web view's ongoing memory use. --- SVWebViewController/SVWebViewController.m | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/SVWebViewController/SVWebViewController.m b/SVWebViewController/SVWebViewController.m index b3f5951..28fc0c6 100644 --- a/SVWebViewController/SVWebViewController.m +++ b/SVWebViewController/SVWebViewController.m @@ -415,9 +415,17 @@ - (void) actionButtonClicked: (UIBarButtonItem *) sender { } // -actionButtonClicked: -- (void)doneButtonClicked:(id)sender { - [self.webView stopLoading]; - [self dismissViewControllerAnimated:YES completion:NULL]; -} +- (void) doneButtonClicked: (id) sender { + + [self.webView loadRequest: + [NSURLRequest requestWithURL: + [NSURL URLWithString: @"about:blank"]]]; + + dispatch_async(dispatch_get_main_queue(), ^{ + + [self dismissViewControllerAnimated:YES completion:NULL]; + }); + +} // -doneButtonClicked: @end From ce0fae22bc1882e031b7bb48bb73cd1873a2d0d4 Mon Sep 17 00:00:00 2001 From: "Andrew W. Donoho" Date: Mon, 17 Nov 2014 23:05:49 -0600 Subject: [PATCH 11/18] Move the completion block assignment before the presentation of the popover. --- SVWebViewController/SVWebViewController.m | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/SVWebViewController/SVWebViewController.m b/SVWebViewController/SVWebViewController.m index 28fc0c6..6628284 100644 --- a/SVWebViewController/SVWebViewController.m +++ b/SVWebViewController/SVWebViewController.m @@ -396,14 +396,13 @@ - (void) actionButtonClicked: (UIBarButtonItem *) sender { pc = [UIPopoverController.alloc initWithContentViewController: avc]; pc.popoverContentSize = avc.preferredContentSize; - - [pc presentPopoverFromBarButtonItem: sender - permittedArrowDirections: UIPopoverArrowDirectionAny - animated: YES]; avc.completionHandler = ^(NSString *activityType, BOOL completed) { [pc dismissPopoverAnimated: YES]; }; + [pc presentPopoverFromBarButtonItem: sender + permittedArrowDirections: UIPopoverArrowDirectionAny + animated: YES]; } else { From f849fb9aa3fed6c894e3f99a218bbc7daad46871 Mon Sep 17 00:00:00 2001 From: "Andrew W. Donoho" Date: Fri, 12 Dec 2014 09:22:40 -0600 Subject: [PATCH 12/18] Restore a super call. --- SVWebViewController/SVWebViewController.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SVWebViewController/SVWebViewController.m b/SVWebViewController/SVWebViewController.m index 6628284..27e4938 100644 --- a/SVWebViewController/SVWebViewController.m +++ b/SVWebViewController/SVWebViewController.m @@ -144,7 +144,8 @@ - (void) viewWillAppear: (BOOL) animated { } // -viewWillAppear: - (void)viewDidAppear:(BOOL)animated { - + [super viewDidAppear: animated]; + id delegate = self.delegate; if ([delegate respondsToSelector: @selector(webViewControllerDidAppear:)]) { From 99d02ab83be6937777ca67d9b859428463e28bff Mon Sep 17 00:00:00 2001 From: "Andrew W. Donoho" Date: Fri, 12 Dec 2014 09:23:06 -0600 Subject: [PATCH 13/18] Cosmetic edits. --- SVWebViewController/SVWebViewController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SVWebViewController/SVWebViewController.m b/SVWebViewController/SVWebViewController.m index 27e4938..be80bab 100644 --- a/SVWebViewController/SVWebViewController.m +++ b/SVWebViewController/SVWebViewController.m @@ -145,7 +145,7 @@ - (void) viewWillAppear: (BOOL) animated { - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear: animated]; - + id delegate = self.delegate; if ([delegate respondsToSelector: @selector(webViewControllerDidAppear:)]) { From e04d795ea71bc185513e6afa12d8dfa85ff4a591 Mon Sep 17 00:00:00 2001 From: "Andrew W. Donoho" Date: Sun, 3 May 2015 15:10:51 -0500 Subject: [PATCH 14/18] Update the activities completion handler for iOSv8. --- SVWebViewController/SVWebViewController.m | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/SVWebViewController/SVWebViewController.m b/SVWebViewController/SVWebViewController.m index be80bab..d4eb9ea 100644 --- a/SVWebViewController/SVWebViewController.m +++ b/SVWebViewController/SVWebViewController.m @@ -397,10 +397,17 @@ - (void) actionButtonClicked: (UIBarButtonItem *) sender { pc = [UIPopoverController.alloc initWithContentViewController: avc]; pc.popoverContentSize = avc.preferredContentSize; +#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0) + avc.completionWithItemsHandler = ^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) { + + [pc dismissPopoverAnimated: YES]; + }; +#else avc.completionHandler = ^(NSString *activityType, BOOL completed) { [pc dismissPopoverAnimated: YES]; }; +#endif [pc presentPopoverFromBarButtonItem: sender permittedArrowDirections: UIPopoverArrowDirectionAny animated: YES]; From 37a368321f8b5a61a0541841a58a616f01ec6660 Mon Sep 17 00:00:00 2001 From: "Andrew W. Donoho" Date: Tue, 12 May 2015 16:42:52 -0500 Subject: [PATCH 15/18] Align with iOS naming convention for barTintColor. --- SVWebViewController/SVModalWebViewController.h | 4 ++-- SVWebViewController/SVModalWebViewController.m | 12 +++++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/SVWebViewController/SVModalWebViewController.h b/SVWebViewController/SVModalWebViewController.h index b4016bd..074bde6 100644 --- a/SVWebViewController/SVModalWebViewController.h +++ b/SVWebViewController/SVModalWebViewController.h @@ -6,14 +6,14 @@ // // https://github.com/samvermette/SVWebViewController -#import +@import UIKit; @interface SVModalWebViewController : UINavigationController - (id)initWithAddress:(NSString*)urlString; - (id)initWithURL:(NSURL *)URL; -@property (nonatomic) UIColor *barsTintColor; +@property (nonatomic) UIColor *barTintColor; @property (getter = isBarAttached, nonatomic) BOOL barAttached; @end diff --git a/SVWebViewController/SVModalWebViewController.m b/SVWebViewController/SVModalWebViewController.m index 4cd5244..0324fb0 100644 --- a/SVWebViewController/SVModalWebViewController.m +++ b/SVWebViewController/SVModalWebViewController.m @@ -40,12 +40,18 @@ - (id)initWithURL:(NSURL *)URL { return self; } -- (void)viewWillAppear:(BOOL)animated { +- (void) viewWillAppear: (BOOL) animated { + [super viewWillAppear:NO]; self.webViewController.title = self.title; - self.navigationBar.tintColor = self.barsTintColor; -} + + if (self.barTintColor) { + + self.navigationBar.barTintColor = self.barTintColor; + } + +} // -viewWillAppear: #pragma mark - UIToolbarDelegate methods. From eb863895301ec8f20cb660fa86a369e51cbbc9e6 Mon Sep 17 00:00:00 2001 From: "Andrew W. Donoho" Date: Sat, 20 Jun 2015 14:09:33 -0500 Subject: [PATCH 16/18] Use Objective-C @import modules. --- SVWebViewController/SVWebViewController.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SVWebViewController/SVWebViewController.h b/SVWebViewController/SVWebViewController.h index 29fe51c..9749987 100644 --- a/SVWebViewController/SVWebViewController.h +++ b/SVWebViewController/SVWebViewController.h @@ -6,6 +6,8 @@ // // https://github.com/samvermette/SVWebViewController +@import UIKit; + @protocol SVWebViewControllerDelegate; @protocol SVWebViewPresenter @end From 5cc94d609172133d90e1241760f00aea439e6b08 Mon Sep 17 00:00:00 2001 From: "Andrew W. Donoho" Date: Mon, 26 Oct 2015 15:02:36 -0500 Subject: [PATCH 17/18] Make the Objective-C more robust by explicitly testing for nullability. --- .../UIActivities/SVWebViewControllerActivity.h | 4 +++- .../UIActivities/SVWebViewControllerActivity.m | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/SVWebViewController/UIActivities/SVWebViewControllerActivity.h b/SVWebViewController/UIActivities/SVWebViewControllerActivity.h index 1d643e8..ad3fa10 100644 --- a/SVWebViewController/UIActivities/SVWebViewControllerActivity.h +++ b/SVWebViewController/UIActivities/SVWebViewControllerActivity.h @@ -6,7 +6,8 @@ // // -#import +@import UIKit; +NS_ASSUME_NONNULL_BEGIN @interface SVWebViewControllerActivity : UIActivity @@ -14,3 +15,4 @@ @property (nonatomic, strong) NSString *schemePrefix; @end +NS_ASSUME_NONNULL_END diff --git a/SVWebViewController/UIActivities/SVWebViewControllerActivity.m b/SVWebViewController/UIActivities/SVWebViewControllerActivity.m index df362b6..943480b 100644 --- a/SVWebViewController/UIActivities/SVWebViewControllerActivity.m +++ b/SVWebViewController/UIActivities/SVWebViewControllerActivity.m @@ -8,6 +8,8 @@ #import "SVWebViewControllerActivity.h" +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnullable-to-nonnull-conversion" @implementation SVWebViewControllerActivity - (NSString *)activityType { @@ -30,3 +32,4 @@ - (void)prepareWithActivityItems:(NSArray *)activityItems { } @end +#pragma clang diagnostic pop From bb823f7a39b6ae9e3f3f1d00d2b02c6677fed57a Mon Sep 17 00:00:00 2001 From: "Andrew W. Donoho" Date: Wed, 18 Nov 2015 15:52:41 -0600 Subject: [PATCH 18/18] Update OpenInChrome for iOSv7+. --- .gitmodules | 2 +- SVWebViewController/vendors/OpenInChromeController | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index 0b5450f..522e0cf 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "SVWebViewController/vendors/OpenInChromeController"] path = SVWebViewController/vendors/OpenInChromeController - url = https://github.com/GoogleChrome/OpenInChrome.git +url=https://github.com/adonoho/OpenInChrome.git diff --git a/SVWebViewController/vendors/OpenInChromeController b/SVWebViewController/vendors/OpenInChromeController index 4e139b0..ca39b6a 160000 --- a/SVWebViewController/vendors/OpenInChromeController +++ b/SVWebViewController/vendors/OpenInChromeController @@ -1 +1 @@ -Subproject commit 4e139b0253ee99ad9c2d3d0de48a8a36426c1e90 +Subproject commit ca39b6a6d6f6e646a206cc07ca7d92c977306afc