Как остановить анимацию заголовка UINavigationBar во время перехода push

Есть ли способ остановить titleView на UINavigationBar для анимации, когда я нажимаю/выталкиваю контроллеры просмотра. TitleView для каждого экрана одинаковый (логотип приложения).

В настоящее время, когда я нажимаю представление, titleView на панели навигации также перемещается вместе с представлением.


person Manish Ahuja    schedule 05.05.2014    source источник
comment
добавьте свой другой код передачи представления.   -  person Darshan Kunjadiya    schedule 05.05.2014
comment
Используйте UINavigationController вместо UINavigationBar.   -  person Anand Suthar    schedule 05.05.2014


Ответы (3)


Пытаться,

[self.navigationController pushViewController:viewController animated:NO];
person NKB    schedule 05.05.2014
comment
NKB, это также предотвратит анимацию push между контроллерами представления. - person Manish Ahuja; 05.05.2014
comment
Да, будет, но так как анимация кнопки обрабатывается UINavigationController, это один из способов. - person NKB; 05.05.2014
comment
Если вы хотите справиться с этим, есть еще один вариант — переопределить метод pushViewController и изменить код. Что-то похожее на код здесь hanspinckaers.com/ - person NKB; 05.05.2014

Задайте для заголовка элемента навигации в каждом контроллере представления пустую строку и добавьте подпредставление 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];

Это должно дать вам статический заголовок, который не перемещается при переключении между контроллерами представления.

person psobko    schedule 04.08.2015

Свифт

Допустимое решение:

Используйте 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()
            }
        }
}
person Krunal    schedule 19.03.2017