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

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

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

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

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

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

【问题讨论】:

    标签: iphone ios objective-c ipad cocoa-touch


    【解决方案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:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多