【问题标题】:UINavigationController animation changeUINavigationController 动画变化
【发布时间】:2026-02-23 01:35:01
【问题描述】:

我来自这个问题:How to change the Push and Pop animations in a navigation based app

我想反转 push 和 pop 的动画。因此,默认动画不是向右,而是向左,反之亦然。

我创建了UINavigationController 的子类并覆盖了 push 和 pop 方法。

代码如下:

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    CATransition* transition = [CATransition animation];
    transition.duration = 0.4;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    transition.type = kCATransitionPush;//kCATransitionFade; //kCATransitionMoveIn; //, kCATransitionPush, kCATransitionReveal, kCATransitionFade
    transition.subtype = kCATransitionFromLeft; //kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromBottom
    [self.view.layer addAnimation:transition forKey:nil];

    [super pushViewController:viewController animated:NO];
}

- (UIViewController *)popViewControllerAnimated:(BOOL)animated
{
    CATransition* transition = [CATransition animation];
    transition.duration = 0.4;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    transition.type = kCATransitionPush;//kCATransitionFade; //kCATransitionMoveIn; //, kCATransitionPush, kCATransitionReveal, kCATransitionFade
    transition.subtype = kCATransitionFromRight; //kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromBottom
    [self.view.layer addAnimation:transition forKey:nil];

    UIViewController *poppedVC = [super popViewControllerAnimated:NO];

    return poppedVC;
}

到目前为止,这些都运行良好。

在这些方法中,[self.view.layer addAnimation:transition forKey:nil]; 行让我感到困惑。我看到每次调用方法时都会初始化一个新的CATransition 对象并将其添加到视图层。我不确定这对记忆有什么影响。它安全吗?如果不安全,我应该怎么做才不会损害内存/性能?

【问题讨论】:

    标签: iphone objective-c animation uikit


    【解决方案1】:

    一个简单的解决方案是添加一个 CATransition ivar(或属性)并每次都重用它。也就是说,我怀疑这会显着影响性能,并且在您确定这是一个问题之前担心性能通常没有用。

    所以,简而言之,不用担心。如果您对此感到担心,请制作一个用于每种方法的 ivar。

    【讨论】:

    • 感谢您的提示“在您确定这是一个问题之前,担心性能通常是没有用的。”。我会试试你的建议。
    • 在当今拥有丰富资源的增强型设备世界中,这已被广泛接受为标准做法。在易于实施的地方节约资源从来都不是坏事……