2

我将 iOS 7 中引入的新的自定义视图控制器转换与 UINavigationController 结合使用。我实施了

-navigationController:animationControllerForOperation:fromViewController:toViewController:

在我的 中UINavigationControllerDelegate,实现了UIViewControllerAnimatedTransitioning协议并且自定义转换效果很好。

但是,我想在推送视图控制器时防止导航栏中的移位动画。有趣的是,弹出动画很好,导航项只是 alpha-faded 而不是移位。但是推送动画将导航项从右侧移动。

我通过替换新视图控制器并将其添加到数组中找到了部分-pushViewController:animated:解决-setViewControllers:animated:方案viewControllers。这会执行正确的 alpha 渐变动画 - 除了第一次将视图控制器推送到堆栈上。随后的弹出/推送很好。

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

4

1 回答 1

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
于 2013-12-02T11:44:49.753 回答