UINavigationController 过渡动画触发太快

Posted

技术标签:

【中文标题】UINavigationController 过渡动画触发太快【英文标题】:UINavigationController transition animations triggered too fast 【发布时间】:2013-10-21 16:35:35 【问题描述】:

我在我的字典应用程序中使用了一个定制的容器视图控制器。基本上,容器视图控制器在顶部包含一个自定义导航栏(NOT 一个UINavigationBar--只是一个UIView 带有后退和前进UIButtons、一个UISearchBar 和一个书签@ 987654326@在右边),底部有一个标签栏控制器。

我的问题是:我使用后退和前进按钮在其中一个选项卡(UINavigationController)中推送和弹出视图控制器,以便用户可以浏览字典浏览历史记录。但是,如果我按后退或前进按钮过快,我会在日志窗格中收到此消息,并且某些屏幕根本不会出现:

开始/结束外观转换的不平衡调用 .

查看***,我了解到这是因为单击后退或前进按钮过快调用了活动选项卡中UINavigatonController 的推送/弹出方法,但它并没有让动画完成。 https://***.com/a/17440074/855680

在没有动画的情况下推送或弹出视图控制器可以解决问题,但我确实想保留动画。我该如何解决这个问题?我查看了UINavigationController 类引用,看看是否有任何委托方法或属性表明它处于动画中间,但似乎没有。

【问题讨论】:

【参考方案1】:

我自己修好了。解决方案是在我的容器视图控制器中创建一个属性,指示 UINavigationController 过渡动画是否仍在发生:

@property (nonatomic, getter = isStillAnimatingTransition) BOOL stillAnimatingTransition;

现在,对于我推入UINavigationController 的所有UIViewController 类,我在每个视图控制器的viewWillDisappearviewDidAppear 方法中将此标志设置为YESNO,例如这个:

- (void)viewDidAppear:(BOOL)animated

    [super viewDidAppear:animated];
    self.containerViewController.stillAnimatingTransition = NO;


- (void)viewWillDisappear:(BOOL)animated

    self.containerViewController.stillAnimatingTransition = YES;
    [super viewWillDisappear:animated];

如果动画标志设置为NO,我的容器视图控制器只允许执行后退和前进按钮,如下所示:

- (void)backButtonClicked

    if (!self.isStillAnimatingTransition) 
        // Do whatever.
    


- (void)forwardButtonClicked

    if (!self.isStillAnimatingTransition) 
        // Do whatever.
    

【讨论】:

【参考方案2】:

也许您可以利用 UINavigationControllerDelegate 类并在那里处理事件。

在包含导航控制器的主类中,将委托设置为您自己并在那里处理交互。

即在 .h 文件中:

@interface yourClass : UIViewController <UINavigationControllerDelegate> 
     UINavigationController *content;

然后在.m文件中:

  content = [[UINavigationController alloc] initWithRootViewController:yourRootViewController];
  content.delegate = self;

之后,您可以通过以下函数监听过渡事件,并相应地设置动画标志。

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
    stillAnimatingTransition = NO;

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
    stillAnimatingTransition = YES;

您可以从苹果找到更多关于委托协议的参考资料 https://developer.apple.com/library/ios/documentation/uikit/reference/UINavigationControllerDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/UINavigationControllerDelegate/navigationController:willShowViewController:animated:

【讨论】:

以上是关于UINavigationController 过渡动画触发太快的主要内容,如果未能解决你的问题,请参考以下文章

更改 UINavigationController 过渡效果的正确方法是啥

UINavigationController 自定义过渡移除下面的视图

在 UISplitViewController 中弹出 UINavigationController 会导致奇怪的过渡

翻转过渡 uinavigationcontroller push

UINavigationController 上视图之间的过渡动​​画有多长?

UINavigationController 过渡动画触发太快