【问题标题】:Pushing a UITableViewController with custom animation always animates UINavigationItem Title推送带有自定义动画的 UITableViewController 始终为 UINavigationItem 标题设置动画
【发布时间】:2012-05-03 18:31:42
【问题描述】:

我使用以下代码作为UINavigationController 的扩展来推送具有自定义动画的视图控制器:

@implementation UINavigationController (PushAnimation)

- (void)pushViewController:(UIViewController*)controller  withTransition:(UIViewAnimationTransition)transition
{
    [UIView beginAnimations:nil context:NULL];
    [self pushViewController:controller animated:NO];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationBeginsFromCurrentState:YES];        
    [UIView setAnimationTransition:transition forView:self.view cache:YES];
    [UIView commitAnimations];
}

@end

启用缓存后,我在推送UITableViewController 时会出现奇怪的动画行为。自定义动画完成后出现推送视图的标题。使用过渡样式UIViewAnimationTransitionNone,很明显标题本身是动画的。它从屏幕的左上角移动到UINavigationBar 的中心。

在禁用缓存的情况下,由于其速度,此动画不可见,但帧速率显着下降。

如何防止标题被动画化?

【问题讨论】:

  • 我认为标题的动画发生在UINavigationBar代码中。一个想法是将其子类化并更改其默认行为

标签: objective-c ios animation uinavigationcontroller uinavigationitem


【解决方案1】:

问题是你在动画整个视图self.viewself.view 包含视图控制器以及 UINavigationBar。因此,您可能必须获取 self.view 的所有子视图,然后仅对与您的视图控制器相关的 view 进行动画处理。

【讨论】:

  • 好吧,我也想为导航栏设置动画,因为我想改变整个屏幕,而不仅仅是 UINavigationBar 下面的内容。问题是,我似乎无法禁用 UINavigationbar 的默认导航。
【解决方案2】:

使用此代码以非常直接的方式自定义您的导航过渡动画:

CATransition* transition = [CATransition animation];
transition.duration = 0.5;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionMoveIn; //kCATransitionPush; //kCATransitionReveal; //kCATransitionFade; 
//transition.subtype = kCATransitionFromRight; //transition.subtype = kCATransitionFromLeft; //transition.subtype = kCATransitionFromTop; //transition.subtype = kCATransitionFromBottom;
transition.subtype = kCATransitionFromRight;
[self.navigationController.view.layer addAnimation:transition forKey:nil];
[[self navigationController] popViewControllerAnimated:NO];

推送也是一样的。

**确保在你的课堂上#import <QuartzCore/QuartzCore.h> ,并将框架添加到你的项目中

target > Build Phases > Link Binary With Libraries > “+”按钮 > QuartzCore.framework

.**

【讨论】:

    【解决方案3】:

    只是快速更新一下我的解决方法到底是什么。无法覆盖 UINavigationBar 的默认行为,因为 iOS 使用私有 API 来实现动画。所以我最终使用以下代码删除了UINavigationBar 及其各种子视图上的所有动画:

    [self.navigationBar.layer removeAllAnimations];
    for (UIView *view in self.navigationBar.subviews) {
        [view.layer removeAllAnimations];
        for (UIView *sub in view.subviews) {
            [sub.layer removeAllAnimations];
        }
    }
    

    [self pushViewController:controller animated:NO];之后调用它很重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多