不同 UINavigationController 中的不同外观

Posted

技术标签:

【中文标题】不同 UINavigationController 中的不同外观【英文标题】:Different appearances in different UINavigationControllers 【发布时间】:2017-10-11 15:19:49 【问题描述】:

ios 11 中,我目前正在更改导航控制器的后退按钮,如下所示:

UINavigationBar.appearance().backIndicatorImage = whiteBackButtonImage!.withRenderingMode(.alwaysOriginal)
UINavigationBar.appearance().backIndicatorTransitionMaskImage = whiteBackButtonImage!.withRenderingMode(.alwaysOriginal)

这似乎工作正常,问题是当我想区分两种使用不同背景图像的 UINavigationControllers 时:

let whiteNavigationBarAppearance = UINavigationBar.appearance(whenContainedInInstancesOf: [WhiteNavigationController.self])
whiteNavigationBarAppearance.backIndicatorImage = greenBackButtonImage!.withRenderingMode(.alwaysOriginal)
whiteNavigationBarAppearance.backIndicatorTransitionMaskImage = greenBackButtonImage!.withRenderingMode(.alwaysOriginal)

let greenNavigationBarAppearance = UINavigationBar.appearance(whenContainedInInstancesOf: [GreenNavigationController.self])
greenNavigationBarAppearance.backIndicatorImage = whiteBackButtonImage!.withRenderingMode(.alwaysOriginal)
greenNavigationBarAppearance.backIndicatorTransitionMaskImage = whiteBackButtonImage!.withRenderingMode(.alwaysOriginal)

使用第二种方法时,会显示常规的后退按钮,因此它无法识别更改。有人知道我的方法有什么问题吗?

【问题讨论】:

你使用故事板吗?您是否为导航控制器分配了适当的类? 不,我正在以编程方式创建导航控制器。 【参考方案1】:

我已经在辅助项目中重新创建了您的场景,并且您提供的 sn-p 工作正常。我认为您的视图控制器层次结构中可能有一些东西。

这就是我构建层次结构的方式。 ViewController 有一个按钮,可以在导航堆栈上推动另一个 UIViewController

let redViewController = ViewController()
redViewController.view.backgroundColor = .red

let greenViewController = ViewController()
greenViewController.view.backgroundColor = .green

let red = RedNavigationController(rootViewController: redViewController)
red.tabBarItem = UITabBarItem(tabBarSystemItem: .bookmarks, tag: 1)

let green = GreenNavigationController(rootViewController: greenViewController)
green.tabBarItem = UITabBarItem(tabBarSystemItem: .contacts, tag: 2)

let tabBarController = UITabBarController()
tabBarController.setViewControllers([red, green], animated: false)
tabBarController.selectedIndex = 0

这就是我设置外观的方式。

let image1 = UIImage(named: "Button")!.withRenderingMode(.alwaysOriginal)
let image2 = UIImage(named: "Button2")!.withRenderingMode(.alwaysOriginal)

let red = UINavigationBar.appearance(whenContainedInInstancesOf: [RedNavigationController.self])
red.backIndicatorImage = image1
red.backIndicatorTransitionMaskImage = image1

let green = UINavigationBar.appearance(whenContainedInInstancesOf: [GreenNavigationController.self])
green.backIndicatorImage = image2
green.backIndicatorTransitionMaskImage = image2

这就是结果

【讨论】:

以上是关于不同 UINavigationController 中的不同外观的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationController:推自我?

UIPopoverController 以不同的速度调整弹出框和内容视图控制器(uinavigationcontroller)的大小

使用 swift 更改 UINavigationController 标题时延迟

UINavigationController

如何根据 UINavigationController 中显示的 UIViewController 更改 UINavigationBar

UITabBarController/UINavigationController 旋转问题