Brion VIBBER has uploaded a new change for review. https://gerrit.wikimedia.org/r/144735
Change subject: Work in progress: pull to refresh refactor ...................................................................... Work in progress: pull to refresh refactor Refactored pull-to-refresh logic out of WebViewController into PullToRefreshViewController, which can be subclassed and reused. Child class needs to override methods to get the scroll view, return appropriate strings for the label, and perform action on completion. Note that this sets the scroll view's delegate to the view controller, so if doing additional scroll view delegate stuff you may need to call a parent method to avoid losing the pull to refresh behavior. Change-Id: I7c4a69f5598f9bd359567074992ce4253d4df6ee --- M Wikipedia.xcodeproj/project.pbxproj A wikipedia/View Controllers/PullToRefresh/PullToRefreshViewController.h A wikipedia/View Controllers/PullToRefresh/PullToRefreshViewController.m M wikipedia/View Controllers/SavedPages/SavedPagesViewController.h M wikipedia/View Controllers/SavedPages/SavedPagesViewController.m M wikipedia/View Controllers/WebView/WebViewController.h M wikipedia/View Controllers/WebView/WebViewController.m 7 files changed, 320 insertions(+), 127 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/apps/ios/wikipedia refs/changes/35/144735/1 diff --git a/Wikipedia.xcodeproj/project.pbxproj b/Wikipedia.xcodeproj/project.pbxproj index e5a637d..3071683 100644 --- a/Wikipedia.xcodeproj/project.pbxproj +++ b/Wikipedia.xcodeproj/project.pbxproj @@ -169,6 +169,7 @@ D4991449181D51DE00E6073C /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D4991448181D51DE00E6073C /* AppDelegate.m */; }; D499144C181D51DE00E6073C /* Main_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D499144A181D51DE00E6073C /* Main_iPhone.storyboard */; }; D4991454181D51DE00E6073C /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D4991453181D51DE00E6073C /* Images.xcassets */; }; + D49B2ED2196C687C002F035D /* PullToRefreshViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D49B2ED1196C687C002F035D /* PullToRefreshViewController.m */; }; D4B0AE0219365F7C00F0AC90 /* EventLoggingFunnel.m in Sources */ = {isa = PBXBuildFile; fileRef = D4B0AE0119365F7C00F0AC90 /* EventLoggingFunnel.m */; }; D4B0AE051936604700F0AC90 /* EditFunnel.m in Sources */ = {isa = PBXBuildFile; fileRef = D4B0AE041936604700F0AC90 /* EditFunnel.m */; }; D4B0AE0819366A0A00F0AC90 /* CreateAccountFunnel.m in Sources */ = {isa = PBXBuildFile; fileRef = D4B0AE0719366A0A00F0AC90 /* CreateAccountFunnel.m */; }; @@ -669,6 +670,8 @@ D4991462181D51DF00E6073C /* Wikipedia-Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Wikipedia-Tests-Info.plist"; sourceTree = "<group>"; }; D4991464181D51DF00E6073C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; }; D4991466181D51DF00E6073C /* Wikipedia_Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Wikipedia_Tests.m; sourceTree = "<group>"; }; + D49B2ED0196C687C002F035D /* PullToRefreshViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PullToRefreshViewController.h; path = PullToRefresh/PullToRefreshViewController.h; sourceTree = "<group>"; }; + D49B2ED1196C687C002F035D /* PullToRefreshViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PullToRefreshViewController.m; path = PullToRefresh/PullToRefreshViewController.m; sourceTree = "<group>"; }; D4B0AE0019365F7C00F0AC90 /* EventLoggingFunnel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EventLoggingFunnel.h; path = EventLogging/EventLoggingFunnel.h; sourceTree = "<group>"; }; D4B0AE0119365F7C00F0AC90 /* EventLoggingFunnel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EventLoggingFunnel.m; path = EventLogging/EventLoggingFunnel.m; sourceTree = "<group>"; }; D4B0AE031936604700F0AC90 /* EditFunnel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EditFunnel.h; path = EventLogging/EditFunnel.h; sourceTree = "<group>"; }; @@ -1103,6 +1106,7 @@ 04C43AB0183441A4006C643B /* View Controllers */ = { isa = PBXGroup; children = ( + D49B2ECF196C684F002F035D /* PullToRefresh */, 04A97E8418B81D440046B166 /* AccountCreation */, 04B7B9BA18B5569600A63551 /* Captcha */, 043DAC481901C3D2001CD17C /* Credits */, @@ -1516,6 +1520,15 @@ name = "Supporting Files"; sourceTree = "<group>"; }; + D49B2ECF196C684F002F035D /* PullToRefresh */ = { + isa = PBXGroup; + children = ( + D49B2ED0196C687C002F035D /* PullToRefreshViewController.h */, + D49B2ED1196C687C002F035D /* PullToRefreshViewController.m */, + ); + name = PullToRefresh; + sourceTree = "<group>"; + }; D4B0ADFF19365F4600F0AC90 /* EventLogging */ = { isa = PBXGroup; children = ( @@ -1757,6 +1770,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + D49B2ED2196C687C002F035D /* PullToRefreshViewController.m in Sources */, 0449E63518A9845C00D51524 /* LoginViewController.m in Sources */, 04D149EC18888A0D006B4104 /* DownloadSectionsOp.m in Sources */, 04DB0BEA18BD37F900B4BCF3 /* UIScrollView+ScrollSubviewToLocation.m in Sources */, diff --git a/wikipedia/View Controllers/PullToRefresh/PullToRefreshViewController.h b/wikipedia/View Controllers/PullToRefresh/PullToRefreshViewController.h new file mode 100644 index 0000000..1810cb7 --- /dev/null +++ b/wikipedia/View Controllers/PullToRefresh/PullToRefreshViewController.h @@ -0,0 +1,48 @@ +// +// PullToRefreshViewController.h +// Wikipedia +// +// Created by Brion on 7/8/14. +// Copyright (c) 2014 Wikimedia Foundation. All rights reserved. +// + +#import <UIKit/UIKit.h> + +@interface PullToRefreshViewController : UIViewController <UIScrollViewDelegate> + +@property (weak, nonatomic) NSLayoutConstraint *pullToRefreshViewBottomConstraint; +@property (strong, nonatomic) UILabel *pullToRefreshLabel; +@property (strong, nonatomic) UIView *pullToRefreshView; + +/** + * If you override this, you must call the super! + */ +- (void)scrollViewDidScroll:(UIScrollView *)scrollView; + +/** + * Returns the scroll view to operate on. + * Defaults to self.view + */ +-(UIScrollView *)refreshScrollView; + +/** + * Get a localized string to show when pulling, before activation + */ +-(NSString *)refreshPromptString; + +/** + * Get a localized string to show during refresh + */ +-(NSString *)refreshRunningString; + +/** + * Called when the custom pull-to-refresh control is triggered + */ +-(void)refreshWasPulled; + +/** + * Allows for disabling the refresh behavior + */ +-(BOOL)refreshShouldShow; + +@end diff --git a/wikipedia/View Controllers/PullToRefresh/PullToRefreshViewController.m b/wikipedia/View Controllers/PullToRefresh/PullToRefreshViewController.m new file mode 100644 index 0000000..42d8f3d --- /dev/null +++ b/wikipedia/View Controllers/PullToRefresh/PullToRefreshViewController.m @@ -0,0 +1,224 @@ +// +// PullToRefreshViewController.m +// Wikipedia +// +// Created by Brion on 7/8/14. +// Copyright (c) 2014 Wikimedia Foundation. All rights reserved. +// + +#import "PullToRefreshViewController.h" + +@interface PullToRefreshViewController () + +@end + +@implementation PullToRefreshViewController + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + // Custom initialization + } + return self; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + // Do any additional setup after loading the view. + + // Take over the scroll view's delegate + UIScrollView *scrollView = [self refreshScrollView]; + assert(scrollView != nil); + scrollView.delegate = self; + [self setupPullToRefresh]; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +/* +#pragma mark - Navigation + +// In a storyboard-based application, you will often want to do a little preparation before navigation +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender +{ + // Get the new view controller using [segue destinationViewController]. + // Pass the selected object to the new view controller. +} +*/ + +#pragma mark - UIScrollViewDelegate methods + +- (void)scrollViewDidScroll:(UIScrollView *)scrollView +{ + [self updatePullToRefreshForScrollView:scrollView]; +} + + +#pragma mark - Internal methods + +-(void)setupPullToRefresh +{ + self.pullToRefreshLabel = [[UILabel alloc] init]; + self.pullToRefreshLabel.translatesAutoresizingMaskIntoConstraints = NO; + self.pullToRefreshLabel.backgroundColor = [UIColor clearColor]; + self.pullToRefreshLabel.textAlignment = NSTextAlignmentCenter; + self.pullToRefreshLabel.numberOfLines = 2; + self.pullToRefreshLabel.font = [UIFont systemFontOfSize:10]; + self.pullToRefreshLabel.textColor = [UIColor darkGrayColor]; + + self.pullToRefreshView = [[UIView alloc] init]; + self.pullToRefreshView.alpha = 0.0f; + self.pullToRefreshView.backgroundColor = [UIColor clearColor]; + self.pullToRefreshView.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:self.pullToRefreshView]; + [self.pullToRefreshView addSubview:self.pullToRefreshLabel]; + + [self constrainPullToRefresh]; +} + +-(void)constrainPullToRefresh +{ + self.pullToRefreshViewBottomConstraint = + [NSLayoutConstraint constraintWithItem: self.pullToRefreshView + attribute: NSLayoutAttributeBottom + relatedBy: NSLayoutRelationEqual + toItem: self.view + attribute: NSLayoutAttributeTop + multiplier: 1.0 + constant: 0]; + + NSDictionary *viewsDictionary = @{ + @"pullToRefreshView": self.pullToRefreshView, + @"pullToRefreshLabel": self.pullToRefreshLabel, + @"selfView": self.view + }; + + NSArray *viewConstraintArrays = + @[ + [NSLayoutConstraint constraintsWithVisualFormat: @"H:|[pullToRefreshView]|" + options: 0 + metrics: nil + views: viewsDictionary], + @[self.pullToRefreshViewBottomConstraint], + [NSLayoutConstraint constraintsWithVisualFormat: @"H:|-[pullToRefreshLabel]-|" + options: 0 + metrics: nil + views: viewsDictionary], + [NSLayoutConstraint constraintsWithVisualFormat: @"V:|[pullToRefreshLabel]|" + options: 0 + metrics: nil + views: viewsDictionary], + ]; + + [self.view addConstraints:[viewConstraintArrays valueForKeyPath:@"@unionOfArrays.self"]]; +} + +- (void)updatePullToRefreshForScrollView:(UIScrollView *)scrollView +{ + if (ROOT.isAnimatingTopAndBottomMenuHidden) return; + + CGFloat pullDistance = (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) ? 85.0f : 55.0f; + + UIGestureRecognizerState state = ((UIPinchGestureRecognizer *)scrollView.pinchGestureRecognizer).state; + + BOOL safeToShow = + (!scrollView.decelerating) + && + (state == UIGestureRecognizerStatePossible) + && + [self refreshShouldShow] + ; + + //NSLog(@"%@", NSStringFromCGPoint(scrollView.contentOffset)); + if ((scrollView.contentOffset.y < 0.0f)){ + + self.pullToRefreshViewBottomConstraint.constant = -scrollView.contentOffset.y; + //self.pullToRefreshViewBottomConstraint.constant = -(fmaxf(scrollView.contentOffset.y, -self.pullToRefreshView.frame.size.height)); + + if (safeToShow) { + self.pullToRefreshView.alpha = 1.0f; + } + + NSString *lineOneText = @""; + NSString *lineTwoText = [self refreshPromptString]; + + if (scrollView.contentOffset.y > -(pullDistance * 0.35)){ + lineOneText = @"▫︎ ▫︎ ▫︎ ▫︎ ▫︎"; + }else if (scrollView.contentOffset.y > -(pullDistance * 0.52)){ + lineOneText = @"▫︎ ▫︎ ▪︎ ▫︎ ▫︎"; + }else if (scrollView.contentOffset.y > -(pullDistance * 0.7)){ + lineOneText = @"▫︎ ▪︎ ▪︎ ▪︎ ▫︎"; + }else if (scrollView.contentOffset.y > -pullDistance){ + lineOneText = @"▫︎ ▪︎ ▪︎ ▪︎ ▫︎"; + }else{ + lineOneText = @"▪︎ ▪︎ ▪︎ ▪︎ ▪︎"; + lineTwoText = [self refreshRunningString]; + } + + self.pullToRefreshLabel.text = [NSString stringWithFormat:@"%@\n%@", lineOneText, lineTwoText]; + } + + if (scrollView.contentOffset.y < -pullDistance) { + if (safeToShow) { + [self refreshWasPulled]; + [UIView animateWithDuration: 0.3f + delay: 0.6f + options: UIViewAnimationOptionTransitionNone + animations: ^{ + self.pullToRefreshView.alpha = 0.0f; + self.pullToRefreshViewBottomConstraint.constant = 0; + [self.view layoutIfNeeded]; + scrollView.panGestureRecognizer.enabled = NO; + } completion: ^(BOOL done){ + scrollView.panGestureRecognizer.enabled = YES; + }]; + } + } +} + +#pragma mark - override these + +-(UIScrollView *)refreshScrollView +{ + if ([self.view isKindOfClass:[UIScrollView class]]) { + return (UIScrollView *)self.view; + } else { + NSLog(@"Override -refreshScrollView to return the correct view"); + return nil; + } +} + +/** + * Get a localized string to show when pulling, before activation + */ +-(NSString *)refreshPromptString +{ + return @"Refresh (not localized)"; +} + +/** + * Get a localized string to show during refresh + */ +-(NSString *)refreshRunningString +{ + return @"Refreshing (not localized)"; +} + + +-(void)refreshWasPulled +{ + NSLog(@"Don't forget to override refreshWasPulled"); +} + +-(BOOL)refreshShouldShow +{ + return YES; +} + +@end diff --git a/wikipedia/View Controllers/SavedPages/SavedPagesViewController.h b/wikipedia/View Controllers/SavedPages/SavedPagesViewController.h index f95c51a..d551511 100644 --- a/wikipedia/View Controllers/SavedPages/SavedPagesViewController.h +++ b/wikipedia/View Controllers/SavedPages/SavedPagesViewController.h @@ -3,8 +3,9 @@ #import <UIKit/UIKit.h> #import "TopMenuViewController.h" +#import "PullToRefreshViewController.h" -@interface SavedPagesViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> +@interface SavedPagesViewController : PullToRefreshViewController <UITableViewDataSource, UITableViewDelegate> @property (nonatomic) NavBarMode navBarMode; diff --git a/wikipedia/View Controllers/SavedPages/SavedPagesViewController.m b/wikipedia/View Controllers/SavedPages/SavedPagesViewController.m index 5015faa..baf54cd 100644 --- a/wikipedia/View Controllers/SavedPages/SavedPagesViewController.m +++ b/wikipedia/View Controllers/SavedPages/SavedPagesViewController.m @@ -304,4 +304,11 @@ }]; } +#pragma mark - Pull to refresh + +- (UIScrollView *)refreshScrollView +{ + return self.tableView; +} + @end diff --git a/wikipedia/View Controllers/WebView/WebViewController.h b/wikipedia/View Controllers/WebView/WebViewController.h index a77aa5a..c6703c3 100644 --- a/wikipedia/View Controllers/WebView/WebViewController.h +++ b/wikipedia/View Controllers/WebView/WebViewController.h @@ -5,8 +5,9 @@ #import "MWNetworkOp.h" #import "CenterNavController.h" #import "MWPageTitle.h" +#import "PullToRefreshViewController.h" -@interface WebViewController : UIViewController <UIWebViewDelegate, NetworkOpDelegate, UIScrollViewDelegate, UIGestureRecognizerDelegate, UIAlertViewDelegate> +@interface WebViewController : PullToRefreshViewController <UIWebViewDelegate, NetworkOpDelegate, UIScrollViewDelegate, UIGestureRecognizerDelegate, UIAlertViewDelegate> @property (weak, nonatomic) IBOutlet UIWebView *webView; @property (nonatomic) BOOL bottomMenuHidden; diff --git a/wikipedia/View Controllers/WebView/WebViewController.m b/wikipedia/View Controllers/WebView/WebViewController.m index 47c2bd5..3031e15 100644 --- a/wikipedia/View Controllers/WebView/WebViewController.m +++ b/wikipedia/View Controllers/WebView/WebViewController.m @@ -82,10 +82,6 @@ @property (weak, nonatomic) IBOutlet NSLayoutConstraint *webViewLeftConstraint; @property (weak, nonatomic) IBOutlet NSLayoutConstraint *webViewRightConstraint; -@property (weak, nonatomic) NSLayoutConstraint *pullToRefreshViewBottomConstraint; -@property (strong, nonatomic) UILabel *pullToRefreshLabel; -@property (strong, nonatomic) UIView *pullToRefreshView; - @property (strong, nonatomic) TOCViewController *tocVC; @property (strong, nonatomic) UISwipeGestureRecognizer *tocSwipeLeftRecognizer; @property (strong, nonatomic) UISwipeGestureRecognizer *tocSwipeRightRecognizer; @@ -180,15 +176,14 @@ } // Ensure the keyboard hides if the web view is scrolled - self.webView.scrollView.delegate = self; + // We already are delegate from PullToRefreshViewController + //self.webView.scrollView.delegate = self; self.webView.backgroundColor = [UIColor whiteColor]; [self.webView hideScrollGradient]; [self reloadCurrentArticleInvalidatingCache:NO]; - - [self setupPullToRefresh]; // Restrict the web view from scrolling horizonally. [self.webView.scrollView addObserver: self @@ -1108,7 +1103,7 @@ [self adjustTopAndBottomMenuVisibilityOnScroll]; - [self updatePullToRefreshForScrollView:scrollView]; + [super scrollViewDidScroll:scrollView]; } - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView @@ -1811,134 +1806,37 @@ #pragma mark Pull to refresh --(void)setupPullToRefresh +-(UIScrollView *)refreshScrollView { - self.pullToRefreshLabel = [[UILabel alloc] init]; - self.pullToRefreshLabel.translatesAutoresizingMaskIntoConstraints = NO; - self.pullToRefreshLabel.backgroundColor = [UIColor clearColor]; - self.pullToRefreshLabel.textAlignment = NSTextAlignmentCenter; - self.pullToRefreshLabel.numberOfLines = 2; - self.pullToRefreshLabel.font = [UIFont systemFontOfSize:10]; - self.pullToRefreshLabel.textColor = [UIColor darkGrayColor]; - - self.pullToRefreshView = [[UIView alloc] init]; - self.pullToRefreshView.alpha = 0.0f; - self.pullToRefreshView.backgroundColor = [UIColor clearColor]; - self.pullToRefreshView.translatesAutoresizingMaskIntoConstraints = NO; - [self.view addSubview:self.pullToRefreshView]; - [self.pullToRefreshView addSubview:self.pullToRefreshLabel]; - - [self constrainPullToRefresh]; + return self.webView.scrollView; } --(void)constrainPullToRefresh +-(NSString *)refreshPromptString { - self.pullToRefreshViewBottomConstraint = - [NSLayoutConstraint constraintWithItem: self.pullToRefreshView - attribute: NSLayoutAttributeBottom - relatedBy: NSLayoutRelationEqual - toItem: self.view - attribute: NSLayoutAttributeTop - multiplier: 1.0 - constant: 0]; - - NSDictionary *viewsDictionary = @{ - @"pullToRefreshView": self.pullToRefreshView, - @"pullToRefreshLabel": self.pullToRefreshLabel, - @"selfView": self.view - }; - - NSArray *viewConstraintArrays = - @[ - [NSLayoutConstraint constraintsWithVisualFormat: @"H:|[pullToRefreshView]|" - options: 0 - metrics: nil - views: viewsDictionary], - @[self.pullToRefreshViewBottomConstraint], - [NSLayoutConstraint constraintsWithVisualFormat: @"H:|-[pullToRefreshLabel]-|" - options: 0 - metrics: nil - views: viewsDictionary], - [NSLayoutConstraint constraintsWithVisualFormat: @"V:|[pullToRefreshLabel]|" - options: 0 - metrics: nil - views: viewsDictionary], - ]; - - [self.view addConstraints:[viewConstraintArrays valueForKeyPath:@"@unionOfArrays.self"]]; + return MWLocalizedString(@"article-pull-to-refresh-prompt", nil); } -- (void)updatePullToRefreshForScrollView:(UIScrollView *)scrollView +-(NSString *)refreshRunningString { - if (ROOT.isAnimatingTopAndBottomMenuHidden) return; + return MWLocalizedString(@"article-pull-to-refresh-is-refreshing", nil); +} - CGFloat pullDistance = (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) ? 85.0f : 55.0f; +-(void)refreshWasPulled +{ + [self reloadCurrentArticleInvalidatingCache:YES]; +} - UIGestureRecognizerState state = ((UIPinchGestureRecognizer *)scrollView.pinchGestureRecognizer).state; - +-(BOOL)refreshShouldShow +{ NSString *title = [SessionSingleton sharedInstance].currentArticleTitle; - - BOOL safeToShow = - (!scrollView.decelerating) - && - ([QueuesSingleton sharedInstance].articleRetrievalQ.operationCount == 0) - && - (![self tocDrawerIsOpen]) - && - (state == UIGestureRecognizerStatePossible) - && - (title && (title.length > 0)) + + return + ([QueuesSingleton sharedInstance].articleRetrievalQ.operationCount == 0) + && + (![self tocDrawerIsOpen]) + && + (title && (title.length > 0)) ; - - //NSLog(@"%@", NSStringFromCGPoint(scrollView.contentOffset)); - if ((scrollView.contentOffset.y < 0.0f)){ - - self.pullToRefreshViewBottomConstraint.constant = -scrollView.contentOffset.y; - //self.pullToRefreshViewBottomConstraint.constant = -(fmaxf(scrollView.contentOffset.y, -self.pullToRefreshView.frame.size.height)); - - if (safeToShow) { - self.pullToRefreshView.alpha = 1.0f; - } - - NSString *lineOneText = @""; - NSString *lineTwoText = MWLocalizedString(@"article-pull-to-refresh-prompt", nil); - - if (scrollView.contentOffset.y > -(pullDistance * 0.35)){ - lineOneText = @"▫︎ ▫︎ ▫︎ ▫︎ ▫︎"; - }else if (scrollView.contentOffset.y > -(pullDistance * 0.52)){ - lineOneText = @"▫︎ ▫︎ ▪︎ ▫︎ ▫︎"; - }else if (scrollView.contentOffset.y > -(pullDistance * 0.7)){ - lineOneText = @"▫︎ ▪︎ ▪︎ ▪︎ ▫︎"; - }else if (scrollView.contentOffset.y > -pullDistance){ - lineOneText = @"▫︎ ▪︎ ▪︎ ▪︎ ▫︎"; - }else{ - lineOneText = @"▪︎ ▪︎ ▪︎ ▪︎ ▪︎"; - lineTwoText = MWLocalizedString(@"article-pull-to-refresh-is-refreshing", nil); - } - - self.pullToRefreshLabel.text = [NSString stringWithFormat:@"%@\n%@", lineOneText, lineTwoText]; - } - - if (scrollView.contentOffset.y < -pullDistance) { - if (safeToShow) { - - //NSLog(@"REFRESH NOW!!!!!"); - - [self reloadCurrentArticleInvalidatingCache:YES]; - - [UIView animateWithDuration: 0.3f - delay: 0.6f - options: UIViewAnimationOptionTransitionNone - animations: ^{ - self.pullToRefreshView.alpha = 0.0f; - self.pullToRefreshViewBottomConstraint.constant = 0; - [self.view layoutIfNeeded]; - scrollView.panGestureRecognizer.enabled = NO; - } completion: ^(BOOL done){ - scrollView.panGestureRecognizer.enabled = YES; - }]; - } - } } #pragma mark Data migration -- To view, visit https://gerrit.wikimedia.org/r/144735 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I7c4a69f5598f9bd359567074992ce4253d4df6ee Gerrit-PatchSet: 1 Gerrit-Project: apps/ios/wikipedia Gerrit-Branch: master Gerrit-Owner: Brion VIBBER <br...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits