如何在 iOS 13 中使用 UINavigationBarAppearance

How to use UINavigationBarAppearance in iOS 13

如何使用这个新的 object 自定义 iOS 13 中的导航栏?我在 Objective-C 中尝试了以下代码,但它无法正常工作。当视图控制器被推送或弹出到导航堆栈时,它只显示我的标题文本属性。

UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
appearance.titleTextAttributes = @{NSFontAttributeName: font};

这是此 object 的文档。 https://developer.apple.com/documentation/uikit/uinavigationbarappearance?language=objc

仅创建 UINavigationBarAppearance 的实例是不够的。您必须实际将其设置在 UINavigationBar 实例(或其外观代理)上。

// Setup the nav bar appearance
UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
appearance.titleTextAttributes = @{NSFontAttributeName: font};

// Apply it to a specific nav bar
someNavBarInstance.standardAppearance = appearance;
// There are also the compactAppearance and scrollEdgeAppearance properties that can be set as needed.

如果您希望在应用程序的所有导航栏上进行相同的自定义,请将其应用于 UINavigationBar.appearance 代理。

UINavigationBar.appearance.standardAppearance = appearance;

在 iOS13 中,您需要像此处一样在 UINavigationBarAppearance object 上设置标题颜色(Objective C 版本):

UINavigationBarAppearance *appearance = [[UINavigationBarAppearance alloc] init];
appearance.titleTextAttributes = @{NSForegroundColorAttributeName: [UIColor whiteColor]};
self.navigationController.navigationBar.standardAppearance = appearance;
self.navigationController.navigationBar.scrollEdgeAppearance = appearance;

对我来说,即使我正确地将外观设置为当前的 UINavigationBar,它仍然无法正常工作。

我发现如果您在已显示的 UINavigationBar 上设置更新外观,则需要调用 navigationBar?.setNeedsLayout()