Отключить анимацию панели навигации - PullRequest
2 голосов
/ 05 марта 2010

Я работаю над навигационным приложением.У меня есть несколько View Controllers, которые я вставляю в Navigation Controller в разных случаях.Ниже приведен код, который я использую для добавления нового View Controller.

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

Одна вещь, которую я заметил, это то, что при нажатии на новый контроллер представления навигационная панель также анимируется (скользит).У меня есть кнопка «Назад», текст заголовка и правая кнопка на панели навигации.Так что это выглядит странно, когда панель навигации анимирована.

Есть ли способ сохранить панель навигации фиксированной, и представление будет анимировано только при нажатии на новый контроллер представления?

Ответы [ 3 ]

0 голосов
/ 30 ноября 2010

Панель навигации скрывается при просмотре изображений в приложении Apple Photo, чтобы обеспечить лучший обзор изображения. Скрыть панель навигации легко. Хотя этот метод не совсем такой же, как приложение «Фото», он будет скрывать и показывать панель навигации с возможностью анимировать переход.

0 голосов
/ 19 марта 2017

Swift

Трудное, но выполнимое решение:

Вам необходимо использовать методы делегата UINavigationController, чтобы узнать, когда отображается UIViewController.Затем для каждого UIViewController необходимо создать логическую переменную, например свойство isInitialized, которая поможет вам определить, когда UIViewController помещается в стек или когда он отображается на задней панели контроллера следующего представления.

Ваш контроллер FirstView:

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

Ваш контроллер SecondView:

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()
            }
        }
}
0 голосов
/ 12 апреля 2010

Я пробовал много разных подходов, но ничего не получалось.Наконец, я использую обходной путь:

1) Передача текущего представления (self.view) первого контроллера представления второму контроллеру представления 2) Выполните pushViewController, например, с переходом затухания.Установите второй контроллер представления в качестве делегата анимации, чтобы сообщить второму контроллеру, если переход завершен. 3) В viewDidLoad второго контроллера представления сохраните представление второго контроллера представления и установите представление первого как self.view

Теперь дисплей должен выглядеть как содержимое первого контроллера представления с панелью навигации (и панели инструментов, если таковая) второго.

Наконец, выполнить во втором контроллере представления (в делегатном методе анимации)) переход, который вы хотите сделать для содержимого, например, flip.

В основном это работает.Мне все еще нужно решить некоторые проблемы с правильной позицией представления и восстановлением представления в первом контроллере представления для моего приложения.

Но это должно дать вам хотя бы подсказку.

Обновление:Исправлены оставшиеся проблемы.Это было немного сложно, потому что первый контроллер представления находится в виде прокрутки.Отключение не было большой проблемой, но переключение обратно в представление прокрутки - неприятная вещь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...