Подтвердить что ты не робот

Как плавно перейти от полупрозрачного к непрозрачному UINavigationBar iOS?

У меня возникают проблемы с реконфигурированием UINavigationBar на iOS 7 и 8 при переходе между представлениями.

В моем приложении в настоящее время содержится поток UIViewController:

VC1 → VC2 → VC3

В этом потоке

  • VC1 является домашним экраном и имеет непрозрачный UINavigationBar
  • VC2 имеет полупрозрачный UINavigationBar
  • VC3 возвращается к наличию непрозрачного UINavigationBar

Проблема, с которой я столкнулся, заключается в том, что переходы между этими представлениями выглядят очень небрежно. Для начала я попробовал следующее:

в VC2

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    // configure appearance
    [self.navigationController.navigationBar configureTranslucentAppearance];
}

И в VC1 и VC3

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    // configure appearance
    [self.navigationController.navigationBar restoreDefaultAppearance];
}

Ниже перечислены реализации двух вспомогательных функций, перечисленных выше:

- (void)restoreDefaultAppearance {
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

    [self setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor JTTextNavBar]}];
    [self setTintColor:[UIColor JTTextNavBar]];
    [self setBarTintColor:[UIColor JTBackgroundNavBarWithAlpha:1.0]];
    [self setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
    [self setBackgroundColor:[UIColor JTBackgroundNavBarWithAlpha:1.0]];
    [self setShadowImage:[UIImage navigationBarShadowImage]];
    [self setTranslucent:NO];
}

- (void)configureTranslucentAppearance {
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

    [self setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
    [self setBackgroundColor:[UIColor clearColor]];
    [self setShadowImage:[UIImage new]];
    [self setTranslucent:YES];
}

Это самый простой способ обработки этого перехода. Он имеет следующие визуальные артефакты:

  • При переходе от VC1 → VC2, как только вы начнете переход, панель навигации станет черной. Обычно анимация завершается enter image description here
  • При переходе с VC2 → VC1 навигационная панель мгновенно меняется на цвет приложения по умолчанию, прежде чем время завершения будет завершено. enter image description here
  • При переходе с VC2 → VC3 навигационная панель мгновенно переходит от полупрозрачного к цвету панели навигации приложения, а затем элементы меню и оживляют тело VC. enter image description here
  • При переходе от VC3 → VC2 навигационная панель мгновенно становится черной и остается таким образом, пока не завершится segue. enter image description here

Ни один из этих переходов не выглядит хорошо. В идеале я бы хотел, чтобы представления плавно переходили вместе с их новым UINavigationBar, но единственный способ, которым я видел это, - это вручную добавить панель инструментов к каждому xib.

Любые предложения? Извините, если это описание запутывает: (

Изменить: Добавлены обрезанные изображения UINavigationBar и верхней части UIViewController для каждого из перечисленных переходов.

4b9b3361

Ответ 1

Наконец-то я нашел достойное решение!

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

Это открывает возможное обходное решение, которое заключается в следующем в viewWillAppear VC2:

[self.navigationController setNavigationBarHidden:YES animated:YES];

После этого вручную добавьте UINavigationBar в свой xib и настройте его как прозрачный (и добавьте все необходимые UIBarButtonItem и представления).

Если все подключено правильно, переход из VC1 в VC2 скроет UINavigationBar с той же скоростью, что и переход на вид, и VC2 > появится с его встроенным UINavigationBar

Примечание.. Чтобы обеспечить правильную работу, вам необходимо убедиться, что в viewWillAppear из контроллеров просмотра, к которым можно получить доступ из VC2, вы reset UINavigationBar, чтобы быть видимым (при необходимости) с помощью:

[self.navigationController setNavigationBarHidden:NO animated:YES];

TL; DR - вручную добавьте UINavigationBar в свой прозрачный контроллер отображения навигационной панели и в viewWillAppear спрячьте по умолчанию значение setNavigationBarHidden:animated:

Ответ 2

Черным цветом, который вы видите, является цвет фона в представлении UINavigationController's. Один из способов минимизировать наблюдение - это управлять цветом фона этого представления на цвет представления исходящего/входящего представления. Это хорошо работает, если вы работаете с сплошными цветами. Другой подход заключается в расширении ваших представлений за непрозрачной навигационной панелью с помощью UIViewController.extendedLayoutIncludesOpaqueBars = YES;

Ответ 3

всегда используйте Translucent, плюс добавьте uiview с цветом ниже него и анимируйте его альфа?

Ответ 4

Я боролся с почти одинаковой проблемой. На самом деле не происходит никаких плавных переходов, использующих панель навигации или панель инструментов в качестве размытия. Лучший вариант, который я нашел *, заключается в том, чтобы сделать изображение из представления, а затем использовать это изображение для перехода. Особенно, если вам просто нужно переходы, это всего лишь самый дешевый вариант, который по-прежнему обеспечивает отличный интерфейс /UX.

* Одно из предостережений заключается в том, что некоторые эффекты пользовательского интерфейса в панели навигации и панели инструментов не отображаются, когда вы делаете снимок, снимок экрана или растеризуете UIView в качестве изображения. Это незначительно, если используется для перехода.

Ответ 5

Вы можете создать свою собственную навигационную панель, используя только UIView, и таким образом вы полностью контролируете ее внешний вид, макет, затухание и т.д. Я отказался от использования UINavigationBar некоторое время назад, поскольку это может быть болью для работы, поскольку вы открываете, и теперь я никогда не использую его.

У меня есть контроллер корневого представления, у которого есть UIView, который представляет панель навигации. Если я хочу сделать что-то вроде кнопки "Добавить", измените цвет, покажите навигационную панель или скройте ее, измените прозрачность и т.д., Которые все контролируются RVC и другими методами управления вызовами в RVC для изменения навигации бар в зависимости от их требований к внешнему виду.

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

Ответ 6

Поэтому я тоже боролся с этим.

К сожалению, у меня не было никакого успеха, добавив мою собственную панель навигации через раскадровку. Вместо этого (и я предупреждаю вас, что это взломанно). Я добавляю представление в ViewController с непрозрачной навигационной панелью, которая имеет отрицательный запас и простирается под панелью навигации.

Когда ViewController с прозрачной навигационной панелью сдвигается, панель сразу становится прозрачной, но из-за одинаково цветного представления, которое у меня есть прямо за ним, это изменение не заметно. Et voila.

Код, который у меня есть, довольно простой и написан на С# (Xamarin), но по причинам полноты....

  var backing = new UIView(new CGRect(0, -68, this.View.Frame.Width, 64f));
  backing.BackgroundColor = UIColor.Green;
  this.View.AddSubview(backing);

Ответ 7

Установите цвет фона UIWindow на панель навигации tintColor.