NavigationController 在 push 和 pop 后会切掉阴影吗?

Posted

技术标签:

【中文标题】NavigationController 在 push 和 pop 后会切掉阴影吗?【英文标题】:NavigationController cut the shadow after push and pop? 【发布时间】:2020-01-29 12:47:11 【问题描述】:

当我向 navigationBar 添加自定义视图并且此视图有阴影时,NavigationController 出现问题,再次推送和弹出时阴影会被剪切?

1:- 推送前的 ViewController A

2:- 推送后的 ViewController B

3:- 弹出后的 ViewController A

这是一个非常简单的类,只包含这段代码

override func viewDidLoad() 
    super.viewDidLoad()

    let view : UIView = UIView(frame: CGRect(x: 0, y: 0, width: 300, height: 40))

    view.layer.shadowOpacity = 1
    view.layer.shadowOffset = CGSize(width: 1.0, height: 1.0)
    view.layer.shadowRadius = 20.0
    view.layer.shadowColor = UIColor.green.cgColor
    view.clipsToBounds = false
    view.layer.masksToBounds = false
    view.backgroundColor = UIColor.red

    self.navigationController?.navigationBar.topItem?.titleView = view

【问题讨论】:

【参考方案1】:

基于一些快速检查...

.navigationBar 有一个“contentView”

在最初出现时,该 contentView 将 .clipsToBounds 设置为 false

一旦你将一个 VC 压入堆栈,该 contentView 的 .clipsToBounds 属性将变为 true

这就是为什么你最初可以看到阴影。

我认为您需要找到另一种方法来获得这种外观...您可以尝试子类化,但 Apple 的文档明确指出:

允许使用 UINavigationBar 类的方法和属性自定义导航栏的外观,但您绝不能更改其框架、边界或 alpha 值或直接修改其视图层次结构。

【讨论】:

以上是关于NavigationController 在 push 和 pop 后会切掉阴影吗?的主要内容,如果未能解决你的问题,请参考以下文章

无法关闭 NavigationController

如何将 NavigationController 保持在 subViewController 方向?

在呈现的 ViewController/NavigationController 上获取 UITabBarController

无法推送 viewController,因为 navigationController 为 nil

在 TabBarController 项中有一个 NavigationController

在 iOS 上的 navigationController 推送上更改 contentSizeForViewInPopover