Заголовок панели навигации и кнопки навигации не отображаются в iOS 11

До iOS 11 кнопки и заголовок UINavigationBar отображаются правильно.

Вчера я загрузил Xcode 9 с iOS 11, и после сборки и запуска без внесения изменений кнопки навигации и заголовок больше не отображаются. Он показывает UINavigationBar с правильным цветом, который я устанавливаю, но ничего больше.

Я пробовал на разных симуляторах, а также обновил iPhone 7 до iOS 11 beta 5, и результат тот же. Ничего не отображается.

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

ИЗМЕНИТЬ со скриншотами: https://imgur.com/a/Hy46c

Заранее спасибо!


person Leeroy Jenkins    schedule 18.08.2017    source источник
comment
можно ли прикрепить свой проект или код, или снимок экрана, или еще   -  person Anbu.Karthik    schedule 18.08.2017
comment
@ Anbu.Karthik Я загрузил пару скриншотов того, что происходит, поскольку проект является частным. Вот они: imgur.com/a/Hy46c   -  person Leeroy Jenkins    schedule 18.08.2017
comment
navigationbar.prefersLargeTitles=NO; ИЛИ navigationbar.prefersLargeTitles=YES; в соответствии с требованиями сделает свое дело.   -  person Ronak Chaniyara    schedule 18.08.2017
comment
@RonakChaniyara Я уже пробовал это безуспешно ...   -  person Leeroy Jenkins    schedule 18.08.2017
comment
попробуйте добавить ограничение ширины для этой кнопки с изображением.   -  person Ronak Chaniyara    schedule 18.08.2017
comment
@RonakChaniyara ограничения ширины? Это UIBarButtonItem, это не настраиваемый вид, помещенный туда с использованием ограничений ... Но это не единственная проблема. Заголовок, самая простая вещь в мире, тоже не отображается ... Я уверен, что исправление заголовка исправит все остальное.   -  person Leeroy Jenkins    schedule 18.08.2017
comment
Может быть, это ошибка iOS11? Моя панель поиска теперь имеет белый текст на белом фоне (что делает его очень трудным для чтения). Раньше это был правильный серый цвет. Я вручную назначил текст в строке поиска UIColor.darkTextColor, но в этом нет необходимости. Моя проблема может быть связана с тем, что вы видите.   -  person Jim Leask    schedule 07.09.2017
comment
У меня такая же проблема с симулятором Xcode 9. Все работает нормально для сборок, которые я тестирую на реальном устройстве iOS 11.   -  person Justin Vallely    schedule 13.09.2017
comment
@LeeroyJenkins, можете ли вы опубликовать код, который вы используете для настройки панели навигации?   -  person Boaz Frenkel    schedule 19.09.2017
comment
Дополнительная информация: Это похоже на Xcode 9, а не на iOS 11. Мы создали нашу версию iOS 11 из Xcode 8 и Xcode 9 на устройстве iOS 11. Только сборка Xcode 9 имела проблему.   -  person Justin Vallely    schedule 19.09.2017
comment
@LeeroyJenkins, у меня такая же проблема. Вы нашли какое-либо решение этой проблемы?   -  person jigs    schedule 03.11.2017
comment
разве ты не играешь в игры с - (UITraitCollection *)traitCollection?   -  person dollar2048    schedule 09.11.2017
comment
эти ошибки панели навигации ios11 так раздражают. я хочу что-то разрушить.   -  person dy_    schedule 29.11.2017
comment
Какой-либо прогресс? Та же проблема.   -  person Andrey Oshev    schedule 01.12.2017


Ответы (11)


Для Xcode 9 кажется, что уже недостаточно просто установить фрейм настраиваемого представления, которое вводится в titleView NavigationItem. Внутренний размер содержимого вашего titleView теперь также должен быть переопределен и установлен.

Вот код, отрегулируйте ширину и высоту в соответствии с вашими потребностями:

class NavigationBarTitleView: UIView {

    override var intrinsicContentSize: CGSize {
        return CGSize(width: bounds.width - 100, height: 50)
    }

    ...

}
person Justin Vallely    schedule 27.09.2017

используйте sizeToFit ()! ios 11 автоматически изменяет его размер, а ios 10 - нет.

person Carly O'Keefe    schedule 10.01.2018

У меня была такая же проблема, и для меня это было вызвано подклассом UITabBarController

person massimobio    schedule 19.09.2017
comment
Я также создаю подклассы UITabBarController. У меня проблема с изображением и заголовком в UITabar, текст переопределяет изображение - person Tran Trung Hieu; 25.09.2017
comment
Причина в том, что я использовал это для сохранения старого стиля iOS для панели вкладок: - (UITraitCollection *) traitCollection {return [UITraitCollection traitCollectionWithHorizontalSizeClass: UIUserInterfaceSizeClassCompact]; } - person Daniele Ceglia; 20.03.2018

Вы установили в своем коде "window, rootViewController = ..."? Попробуйте удалить, это может решить вашу проблему

person Phong Cao    schedule 26.09.2017
comment
Боже мой, ты просто спас мне жизнь, чтобы изо всех сил ее исправить. - person Danyun Liu; 12.06.2018

У меня была такая же проблема в моем проекте, когда заголовки отсутствовали на панелях навигации после обновления до Xcode 9 и iOS 11. Я решил ее, перейдя на панель навигации своего контроллера навигации на раскадровке, не отмечая флажка Prefers Large Titles и изменение шрифта заголовка в атрибутах текста заголовка, который был установлен по умолчанию в Xcode 9 на System 0, на какой-либо другой вариант, например заголовок 1 или заголовок. Я также изменил настройки панели навигации его дочерних контроллеров просмотра For Large Title на Never вместо Automatic или Always.

person rtamesis    schedule 15.10.2017

Я нашел этот код в некоторой унаследованной кодовой базе, закомментировал его, и все работало так же, как и до iOS 11.x.

if (appDelegate.window.rootViewController != self) {
    appDelegate.window.rootViewController = self;
}
person Shawn    schedule 11.01.2018

Попробуй использовать:

        UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]

или без настройки прокси внешнего вида непосредственно на текущую панель навигации ... Это решает мою проблему, следует ли Apple изменить titleText на очистку по умолчанию в iOS11 ...?

Также используйте это, если хотите, чтобы он выглядел так же, как iOS 10:

        if #available(iOS 11, *) {
        nav.navigationBar.prefersLargeTitles = false
    }
person jerrygdm    schedule 22.08.2017
comment
спасибо за ответ, но он не работает ... Прежде чем вносить изменения, вы говорите, что titleTextAttributes из UINavigationBar NSColor и TextColor установлены на UIExtendedGrayColorSpace 1 1. После добавления NSForegroundColorAttributeName остается только атрибут NSColor с тем же значением, что и раньше ... - person Leeroy Jenkins; 23.08.2017
comment
Проведя небольшое исследование, UIExtendedGrayColorSpace 1 1 равно white, так что это уже правильный цвет ... - person Leeroy Jenkins; 23.08.2017

Была такая же проблема с не отображаемой навигационной кнопкой. Я решил это, установив для параметра renderMode значение .alwaysOriginal. (Я не использовал шаблоны)

Код Swift 3:

var img =R.image.smt()?.withRenderingMode(.alwaysOriginal)
person pereckeSokSzam    schedule 28.09.2017

У меня была такая же проблема, и ничего из вышеперечисленного не исправлено. Хотя, @Justin Vallely заставит меня исправить это.

Все, что я сделал, это установил width на titleView, и все заработало отлично!

РЕДАКТИРОВАТЬ:

Каждый UIViewController имеет свойство navigationItem, а каждый navigationItem имеет необязательное свойство titleView.

Для справки: https://developer.apple.com/documentation/uikit/uinavigationitem/1624935-titleview

В моем случае я использовал пользовательский titleView, и я думаю, что это причина проблемы, поскольку Apple изменила API для поддержки нового макета панели навигации.

person Rafael Machado    schedule 11.10.2017
comment
Какой titleView? - person zulkarnain shah; 12.10.2017
comment
Тот, который находится на контроллере представления (UIViewController.navigationItem.titleView) - person Rafael Machado; 12.10.2017
comment
Установка ширины в titleView не решила мою проблему. Я даже безуспешно пробовал intrinsicContentSize. - person Bharat Raichur; 13.10.2017
comment
Не могли бы вы предоставить больше контекста? - person Rafael Machado; 14.10.2017
comment
У меня есть контроллеры представления, добавленные в контроллер навигации. Кнопки заголовка и панели работают нормально с iOS 10 и не работают с iOS 11. Нет ничего особенного в том, как кнопки заголовка и панели добавляются в контроллер навигации. - person Bharat Raichur; 14.10.2017
comment
У вас есть что-нибудь настраиваемое, чтобы изменить панель навигации? В моем случае это было корнем проблемы - person Rafael Machado; 15.10.2017
comment
Когда я отлаживаю иерархию представлений, я получаю следующие предупреждения: AMBIGUOUS LAYOUT for UINavigationBar, может ли это быть причиной того, что панель навигации пуста? Должен ли я установить для translatesAutoresizingMaskIntoConstraints значение NO где-нибудь? Я не вижу предупреждений, когда запускаю его на iOS 10. Я не уверен, где мне нужно установить translatesAutoresizingMaskIntoConstraints, если мне нужно. Любая информация будет полезна. Спасибо. - person Bharat Raichur; 16.10.2017
comment
Вы можете попробовать, конечно ... и убедитесь, что у вас есть допустимые ограничения (так как похоже, что вы его используете) - person Rafael Machado; 16.10.2017
comment
Хорошо, я исправил свою проблему, у меня есть панель вкладок и панель навигации, а кнопки панели вкладок перекрывались с новым стилем для элементов панели вкладок. Итак, я добавил класс коллекции признаков, как упоминалось в этом: stackoverflow.com/questions/44822558/. Я не понимал, это сломало мою панель навигации, и теперь я использовал немного другое решение, упомянутое в том же сообщении, и все работает нормально. - person Bharat Raichur; 17.10.2017
comment
@BharatRaichur, спасибо, чувак. Это тоже решило мою проблему. Странный! - person Andrey Oshev; 01.12.2017

Основываясь на комментарии Джастина Валлели, я немного переработал код, чтобы обеспечить правильный размер представления:

class NavigationBarTitleView: UIView {
    private var width: CGFloat = 0.0
    private var height: CGFloat = 0.0

    override init(frame: CGRect) {
        super.init(frame: frame)
        width = frame.width
        height = frame.height
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override var intrinsicContentSize: CGSize {
        return CGSize(width: width, height: height)
    }
}

В моем конкретном случае я использовал это представление в качестве контейнера для UISearchBar, и теперь оно имеет хороший размер и отлично работает со Swift 4 и iOS 11, так же, как оно раньше работало с предыдущими версиями iOS и Swift.

person Alexander Telegin    schedule 16.10.2017

Мы столкнулись с той же проблемой, когда цвет панели навигации есть, но заголовок и кнопки не отображаются. Мы дважды проверили наличие панели, запустив изменение цвета фона панели навигации через 2 секунды после того, как контроллер навигации появился на экране, поэтому мы знаем, что панель навигации была там, и добавляли кнопки к правильному экземпляру. Как и в случае с OP, эта проблема появляется только в iOS 11, а не в iOS 10, и мы используем Swift 3.2 с Xcode 9.1.

После нескольких часов возни выясняется, что представление контроллера навигации, а затем преобразование его в UIApplication.shared.delegate.window.rootViewController (после нынешней анимации) вызвало проблему в нашем случае.

Если вы просто пропустите текущий контроллер представления и сделаете контроллер навигации корневым контроллером представления, тогда все будет работать нормально. Конечно, в футляре вы потеряете настоящую анимацию.

person Casey    schedule 23.11.2017