2

iOS 7 で導入された新しいカスタム ビュー コントローラー トランジションを UINavigationController と組み合わせて使用​​しています。実装しました

-navigationController:animationControllerForOperation:fromViewController:toViewController:

UINavigationControllerDelegateの では、プロトコルを実装しUIViewControllerAnimatedTransitioning、カスタム トランジションが美しく機能します。

ただし、View Controller を押すと、ナビゲーション バーのシフト アニメーションが表示されないようにしたいと思います。興味深いことに、ポップ アニメーションは問題なく、ナビゲーション アイテムはシフトではなくアルファ フェードされています。しかし、プッシュ アニメーションはナビゲーション項目を右からシフトします。

新しいView Controllerを置き換えて配列に追加することで、部分的な解決策を見つけまし-pushViewController:animated:た。これにより、正しいアルファ フェード アニメーションが実行されます - ビュー コントローラーが初めてスタックにプッシュされる場合を除きます。その後のポップ/プッシュは問題ありません。-setViewControllers:animated:viewControllers

この効果を達成する方法はありますか?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 に答える