2013-09-30 98 views
2

我正在将iOS 7中引入的新自定义视图控制器转换与UINavigationController结合使用。我在UINavigationControllerDelegate实施在自定义视图控制器转换中抑制导航推动动画

-navigationController:animationControllerForOperation:fromViewController:toViewController: 

,实现UIViewControllerAnimatedTransitioning协议和自定义的过渡精美的作品。

但是我想在推视图控制器时阻止导航栏中的移动动画。有趣的是,流行动画很好,导航项目只是淡化而不是移位。但推动动画从右侧移动导航项目。

我找到了部分解决方案,将-pushViewController:animated:替换为-setViewControllers:animated:,并将新视图控制器添加到viewControllers阵列中。这会执行正确的阿尔法衰落动画 - 除了第一次将视图控制器压入堆栈。随后的弹出/推送很好。

任何想法如何实现这种效果? Calendar.app和Photos.app也实现了这一点,所以它应该是可能的(尽管它可能是使用集合视图时的特定行为)。

+0

我不知道,如果你还在这里有一个问题,但我无法重现它。你能提供更多细节吗?当我使用'animationControllerForOperation'指定一个自定义转换时,动画以我期望的方式影响我的内容,并且导航栏淡出(对于push和pop)。 – Rob

+0

它会褪色,但它也会做移位动画。我会发布我的解决方法。 –

回答

0

我写了一个解决办法,从导航栏子视图删除所有位置的动画:

@implementation UIView (FTNavigationBar) 

static CGFloat leftMargin = 8; 

- (void)removePushAnimation { 
    CAAnimation *animation = [self.layer animationForKey:@"position"]; 
    if (animation) { 
     if ([animation isKindOfClass:CABasicAnimation.class] && ((CABasicAnimation*)animation).fromValue) { 
      CGPoint point = [((CABasicAnimation*)animation).fromValue CGPointValue]; 
      CGFloat halfSuperWidth = [self superviewOfKind:FTNavigationBar.class].bounds.size.width/2; 
      if ((fabs(point.x - halfSuperWidth) < 2 && fabs(self.center.x - halfSuperWidth) > 2) || fabs(point.x - self.frame.size.width/2 - leftMargin) < 2) { 
       self.layer.position = point; 
      } 
     } 
     [self.layer removeAnimationForKey:@"position"]; 
    } 
    for (UIView *subview in [self subviews]) { 
     [subview removePushAnimation]; 
    } 
} 

@end 
相关问题