Это поведение, предназначенное для 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 сами создают эти панели, поэтому вы не получите подкласс.