Является ли это поведение новой навигационной панели в бета-версии xcode 11 ошибкой или предназначено? - PullRequest
3 голосов
/ 06 июня 2019

Я заметил после компиляции одного из моих приложений в бета-версии Xcode 11, что навигационные панели не имеют фона, когда установлен prefersLargeTitles.Это предполагаемое поведение?

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

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

 override func viewWillAppear(_ animated: Bool) {
    let textAttributes = [NSAttributedString.Key.foregroundColor:ThemeManager.shared.default1]
    self.navigationController?.navigationBar.largeTitleTextAttributes = textAttributes
    self.navigationController?.navigationBar.titleTextAttributes = textAttributes
    self.navigationController?.navigationBar.tintColor = ThemeManager.shared.default1
 self.navigationController?.setNavigationBarHidden(false, animated: true)
    self.navigationController?.navigationBar.prefersLargeTitles = true
    let nav = self.navigationItem
    nav.title = "My Profile"
}

Вот несколько изображений, показывающих разницу:

слева, скомпилировано на Xcode 10, справа, Xcode 11 beta:

enter image description here enter image description here

После прокрутки вверх по версии 11 Beta фон снова исчезает. Обратите внимание, что приложения, которые не скомпилированы в Xcode11 beta по-прежнему будет вести себя обычным образом, только по какой-то причине изменяется только после компиляции.Это предназначено, и как бы я вернул исходное поведение?

Ответы [ 2 ]

2 голосов
/ 21 июня 2019

Это поведение, предназначенное для iOS 13.

Идея Apple (на мой взгляд, ужасная) состоит в том, что заголовок должен сливаться с контентом, чтобы показать, что он связан.Как только вы начнете прокручивать, когда контент будет находиться за строкой заголовка, строка заголовка приобретет «правильный» вид.

Причина, по которой это ужасно, заключается в том, что все в настоящее время планируют все свои интерфейсы без этого поведения.Таким образом, новое поведение должно быть подписано вместо того, чтобы заставлять всех отказываться (т.е. изменение нарушает код каждого, и если вы собираетесь нарушить код каждого, по крайней мере, вы должны четко понимать, как сохранить проверенное и истинное поведениепоследние 10 лет).

Как и в вашем случае, результат выглядит ужасно.Результат выглядит ужасно и в моем случае.

Apple не дает ответов, но говорит, что вы должны использовать

- scrollEdgeAppearance

из UINavigationBar, чтобы контролировать внешний вид панели, когда содержимоевыравнивает top-of-content по bottom-of-navbar ... в моем случае этот метод возвращает nil, хотя в настоящее время я не уверен, как мы должны это использовать.

Кажется, это обсуждаетсяа также здесь:

Новое представление UINavigationBar на панели подробностей UISplitViewController в iOS 13

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

- (void)viewDidLoad;
{
    [super viewDidLoad];
    if (@available(iOS 13,*)){
        UINavigationBar *bar =self.navigationController.navigationBar;
        bar.scrollEdgeAppearance = bar.standardAppearance;
    }
}

Это работает, но если это предполагаемый подход, я не знаю ...

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

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

EDIT: прогресс ... теперь это работает для управления фоном.Вам нужно вызывать это вместо прямой настройки barTint.

@interface UINavigationBar (Compatibility)
- (void)setCompatibleTint:(UIColor *)fg andBarTint:(UIColor *)bg;
@end

@implementation UINavigationBar (Compatibility)
- (void)setCompatibleTint:(UIColor *)fg andBarTint:(UIColor *)bg;
{
    self.tintColor = fg;
    self.barTintColor = bg;
    if (@available(iOS 13,*)){
        // we need to tell it to adopt old style behavior first
        UINavigationBarAppearance *appearance = self.standardAppearance;
        appearance.backgroundColor = bg;
        NSDictionary *attributes = self.titleTextAttributes;
        appearance.titleTextAttributes = attributes;
        attributes = self.largeTitleTextAttributes;
        appearance.largeTitleTextAttributes = attributes;
        self.scrollEdgeAppearance = appearance;
        self.standardAppearance = appearance;
        self.compactAppearance = appearance;
    }
}
@end

Я еще не совсем уверен в атрибутах текста, но, похоже, он вытекает из цвета фона.Это полная PITA.

Было бы лучше установить это как подкласс и переопределить barTint, но, конечно, многие объекты UIKit сами создают эти панели, поэтому вы не получите подкласс.

1 голос
/ 21 июня 2019

Swift версия решения dbquarrel:

override func viewDidLoad() {
    super.viewDidLoad()
    if #available(iOS 13.0, *) {
        let bar = self.navigationController?.navigationBar
        bar?.scrollEdgeAppearance = bar?.standardAppearance
    } else {
        // Fallback on earlier versions
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...