From b240ac059d9c263b285ab3f9744f4c67826142c2 Mon Sep 17 00:00:00 2001 From: kevinzhow Date: Thu, 13 Jun 2013 00:42:23 +0800 Subject: [PATCH 1/4] Fixed will iter to find the (FlipboardNavigationController) parentviewcontroller --- Classes/FlipBoardNavigationController.m | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/Classes/FlipBoardNavigationController.m b/Classes/FlipBoardNavigationController.m index dc26e67..f894f21 100644 --- a/Classes/FlipBoardNavigationController.m +++ b/Classes/FlipBoardNavigationController.m @@ -118,10 +118,8 @@ - (void) popViewControllerWithCompletion:(FlipBoardNavigationControllerCompletio if (self.viewControllers.count < 2) { return; } - UIViewController *currentVC = [self currentViewController]; UIViewController *previousVC = [self previousViewController]; - [previousVC viewWillAppear:NO]; [UIView animateWithDuration:kAnimationDuration delay:kAnimationDelay options:0 animations:^{ currentVC.view.frame = CGRectOffset(self.view.bounds, self.view.bounds.size.width, 0); CGAffineTransform transf = CGAffineTransformIdentity; @@ -136,7 +134,6 @@ - (void) popViewControllerWithCompletion:(FlipBoardNavigationControllerCompletio [currentVC didMoveToParentViewController:nil]; [self.viewControllers removeObject:currentVC]; _animationInProgress = NO; - [previousVC viewDidAppear:NO]; handler(); } }]; @@ -328,16 +325,17 @@ @implementation UIViewController (FlipBoardNavigationController) - (FlipBoardNavigationController *)flipboardNavigationController { - if([self.parentViewController isKindOfClass:[FlipBoardNavigationController class]]){ - return (FlipBoardNavigationController*)self.parentViewController; - } - else if([self.parentViewController isKindOfClass:[UINavigationController class]] && - [self.parentViewController.parentViewController isKindOfClass:[FlipBoardNavigationController class]]){ - return (FlipBoardNavigationController*)[self.parentViewController parentViewController]; - } - else{ - return nil; + UIViewController *iter = self.parentViewController; + while (iter) { + if ([iter isKindOfClass:[FlipBoardNavigationController class]]) { + return (FlipBoardNavigationController *)iter; + } else if (iter.parentViewController && iter.parentViewController != iter) { + iter = iter.parentViewController; + } else { + iter = nil; + } } + return nil; } From b16eddd3d740037b46ee238dab1113378d2dedc1 Mon Sep 17 00:00:00 2001 From: kevinzhow Date: Thu, 13 Jun 2013 00:50:15 +0800 Subject: [PATCH 2/4] Fix call previousVC viewWillAppear and viewDidAppear --- Classes/FlipBoardNavigationController.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Classes/FlipBoardNavigationController.m b/Classes/FlipBoardNavigationController.m index f894f21..961fb66 100644 --- a/Classes/FlipBoardNavigationController.m +++ b/Classes/FlipBoardNavigationController.m @@ -118,8 +118,10 @@ - (void) popViewControllerWithCompletion:(FlipBoardNavigationControllerCompletio if (self.viewControllers.count < 2) { return; } + UIViewController *currentVC = [self currentViewController]; UIViewController *previousVC = [self previousViewController]; + [previousVC viewWillAppear:NO]; [UIView animateWithDuration:kAnimationDuration delay:kAnimationDelay options:0 animations:^{ currentVC.view.frame = CGRectOffset(self.view.bounds, self.view.bounds.size.width, 0); CGAffineTransform transf = CGAffineTransformIdentity; @@ -134,6 +136,7 @@ - (void) popViewControllerWithCompletion:(FlipBoardNavigationControllerCompletio [currentVC didMoveToParentViewController:nil]; [self.viewControllers removeObject:currentVC]; _animationInProgress = NO; + [previousVC viewDidAppear:NO]; handler(); } }]; From c6e147f1b552dcd66b7328d2f38f0a3ef5c25393 Mon Sep 17 00:00:00 2001 From: kevinzhow Date: Thu, 20 Jun 2013 00:17:31 +0800 Subject: [PATCH 3/4] Add viewDidAppear call before rollbackviewcontroller --- Classes/FlipBoardNavigationController.m | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Classes/FlipBoardNavigationController.m b/Classes/FlipBoardNavigationController.m index 961fb66..261fd50 100644 --- a/Classes/FlipBoardNavigationController.m +++ b/Classes/FlipBoardNavigationController.m @@ -121,6 +121,7 @@ - (void) popViewControllerWithCompletion:(FlipBoardNavigationControllerCompletio UIViewController *currentVC = [self currentViewController]; UIViewController *previousVC = [self previousViewController]; + [previousVC viewWillAppear:NO]; [UIView animateWithDuration:kAnimationDuration delay:kAnimationDelay options:0 animations:^{ currentVC.view.frame = CGRectOffset(self.view.bounds, self.view.bounds.size.width, 0); @@ -228,7 +229,7 @@ - (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecogn #pragma mark - Handle Panning Activity - (void) gestureRecognizerDidPan:(UIPanGestureRecognizer*)panGesture { if(_animationInProgress) return; - + CGPoint currentPoint = [panGesture translationInView:self.view]; CGFloat x = currentPoint.x + _panOrigin.x; @@ -245,6 +246,7 @@ - (void) gestureRecognizerDidPan:(UIPanGestureRecognizer*)panGesture { UIViewController * vc ; vc = [self currentViewController]; + [vc viewWillDisappear:YES]; offset = CGRectGetWidth(vc.view.frame) - x; _percentageOffsetFromLeft = offset/[self viewBoundsWithOrientation:self.interfaceOrientation].size.width; @@ -255,7 +257,7 @@ - (void) gestureRecognizerDidPan:(UIPanGestureRecognizer*)panGesture { // If velocity is greater than 100 the Execute the Completion base on pan direction if(abs(vel.x) > 100) { [self completeSlidingAnimationWithDirection:panDirection]; - }else { + }else { [self completeSlidingAnimationWithOffset:offset]; } } @@ -275,6 +277,7 @@ - (void) completeSlidingAnimationWithDirection:(PanDirection)direction { if(direction==PanDirectionRight){ [self popViewController]; }else { + [[self currentViewController] viewDidAppear:YES]; [self rollBackViewController]; } } @@ -285,6 +288,7 @@ - (void) completeSlidingAnimationWithOffset:(CGFloat)offset{ if(offset<[self viewBoundsWithOrientation:self.interfaceOrientation].size.width/2) { [self popViewController]; }else { + [[self currentViewController] viewDidAppear:YES]; [self rollBackViewController]; } } From c01741c4dd0de7e55d111739e3ae22bc7873e974 Mon Sep 17 00:00:00 2001 From: kevinzhow Date: Thu, 20 Jun 2013 02:18:32 +0800 Subject: [PATCH 4/4] Remove current view when pop to free memory --- Classes/FlipBoardNavigationController.m | 1 + 1 file changed, 1 insertion(+) diff --git a/Classes/FlipBoardNavigationController.m b/Classes/FlipBoardNavigationController.m index 261fd50..243d86d 100644 --- a/Classes/FlipBoardNavigationController.m +++ b/Classes/FlipBoardNavigationController.m @@ -131,6 +131,7 @@ - (void) popViewControllerWithCompletion:(FlipBoardNavigationControllerCompletio _blackMask.alpha = 0.0; } completion:^(BOOL finished) { if (finished) { + [currentVC.view removeFromSuperview]; [currentVC willMoveToParentViewController:nil]; [self.view bringSubviewToFront:[self previousViewController].view]; [currentVC removeFromParentViewController];