如何在推送转换时停止UINavigationBar标题动画

3

在导航控制器中,当我推入/弹出视图控制器时,有没有办法停止导航栏上的titleView动画?每个屏幕的titleView都相同(应用程序的标志)。

目前,当我推入一个视图时,导航栏上的titleView也会随着视图滑动。


添加你的其他视图传递代码。 - Darshan Kunjadiya
使用UINavigationController代替UINavigationBar。 - Anand Suthar
4个回答

1
在每个视图控制器中将导航项的标题设置为空字符串,并向导航栏添加UILabel子视图:
UILabel *titleLabel = [[UILabel alloc] initWithFrame:self.navigationController.navigationBar.bounds];
titleLabel.font = [UIFont fontWithName:@"Avenir-Roman"
                                  size:20.f];
titleLabel.text = @"TEST TITLE";
titleLabel.textAlignment = NSTextAlignmentCenter;
[self.navigationController.navigationBar addSubview:titleLabel];

这将为您提供一个静态标题,当在视图控制器之间切换时不会移动。

0

试一下,

[self.navigationController pushViewController:viewController animated:NO];

NKB,这也将防止视图控制器之间的推送动画。 - Manish Ahuja
是的,它会生效,但由于按钮动画是由 UINavigationController 处理的,这是一种方法。 - NKB
如果您想要处理它,另一个选项是重写pushViewController方法并修改代码。类似于这里的代码http://www.hanspinckaers.com/custom-action-on-back-button-uinavigationcontroller - NKB

0
- (void)viewDidLoad
{
    self.navigationItem.title=@"";

    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

0

Swift

一个可行的解决方案是:

使用 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()
            }
        }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接