【问题标题】:Disable animation of navigation bar禁用导航栏动画
【发布时间】:2011-01-24 05:39:18
【问题描述】:

我正在开发一个基于导航的应用程序。我在不同场合推送到导航控制器的视图控制器很少。以下是我用来推送新视图控制器的代码。

AnotherViewController *anotherViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherView" bundle:nil];
[self.navigationController pushViewController:anotherViewController animated:YES];
[anotherViewController release];

我注意到的一件事是,当新的视图控制器被推送时,导航栏也会动画(滑动)。我在导航栏中有一个后退按钮、标题文本和右键。所以当导航栏动画时看起来很奇怪。

有什么办法可以让导航栏保持固定,并且只有在推送新的视图控制器时才会显示动画?

【问题讨论】:

    标签: ios objective-c xcode animation uinavigationcontroller


    【解决方案1】:

    我尝试了很多不同的方法,但都没有奏效。最后我使用了一种解决方法:

    1) 将第一个视图控制器的当前视图(self.view)交给第二个视图控制器 2)用例如做一个pushViewController一个淡入淡出的过渡。将第二个视图控制器设置为动画的委托,以便在转换完成时通知第二个控制器 3) 在第二个视图控制器的 viewDidLoad 中保存第二个视图控制器的视图并将第一个视图控制器的视图设置为 self.view

    现在显示应该看起来像第一个视图控制器的内容以及第二个视图控制器的导航栏(如果是的话,还有工具栏)。

    最后在第二个视图控制器中(在动画的委托方法中)执行您想要为内容执行的转换,例如翻转。

    基本上可以。我仍然需要解决一些正确的视图位置问题并在我的应用的第一个视图控制器中恢复视图。

    但这至少应该给你一个提示。

    更新:修复了剩余的问题。这有点棘手,因为第一个视图控制器位于滚动视图中。翻出来没什么大不了的,但是翻回滚动视图是一件令人讨厌的事情。

    【讨论】:

      【解决方案2】:

      斯威夫特

      困难但可行的解决方案:

      您需要使用UINavigationController 委托方法来找出UIViewController 的显示时间。然后对于每个UIViewController,需要创建一个类似于isInitialized 属性的布尔变量,它可以帮助您确定UIViewController 何时被推入堆栈,或者何时显示在下一个视图控制器的背面。

      你的 FirstViewController:

      func navigationController(_ navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
              if viewController == self {
                  if self.isInitialized {
                      var navigationBarAnimation = CATransition()
                      navigationBarAnimation.duration = 1.5
                      navigationBarAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
                      navigationBarAnimation.type = kCATransitionFade
                      navigationBarAnimation.subtype = kCATransitionFade
                      navigationBarAnimation.removedOnCompletion = true
                      self.navigationController?.navigationBar?.layer?.addAnimation(navigationBarAnimation, forKey: nil)
                      }
                      else 
                      {
                              self.isInitialized = true;
                      }
              }
      }
      
      func navigationController(_ navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) {
              if viewController == self {
                  if self.isInitialized {
                      self.navigationController?.navigationBar?.layer?.removeAllAnimations()
                  }
              }
      }
      

      你的 SecondViewController:

      func navigationController(_ navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
              if viewController == self {
                  if !self.isInitialized {
                      var navigationBarAnimation = CATransition()
                      navigationBarAnimation.duration = 1.5
                      navigationBarAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
                      navigationBarAnimation.type = kCATransitionFade
                      navigationBarAnimation.subtype = kCATransitionFade
                      navigationBarAnimation.removedOnCompletion = true
                      self.navigationController?.navigationBar?.layer?.addAnimation(navigationBarAnimation, forKey: nil)
                              self.isInitialized = true;
                      }
              }
      }
      
      func navigationController(_ navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) {
              if viewController == self {
                  if self.isInitialized {
                      self.navigationController?.navigationBar?.layer?.removeAllAnimations()
                  }
              }
      }
      

      【讨论】:

        【解决方案3】:

        在 Apple 的照片应用中查看图像时,导航栏会隐藏,以便更好地查看图像。隐藏导航栏很容易。虽然与照片应用程序不完全相同,但此技术将隐藏和显示导航栏,并提供动画转换选项。

        【讨论】:

        • 这没有回答问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多