Ios 用户离开视图控制器后,自定义导航栏标题被剪裁

Ios 用户离开视图控制器后,自定义导航栏标题被剪裁,ios,swift,Ios,Swift,我需要扩展我的导航栏高度,但由于苹果在iOS 11中很难更改导航栏高度,我决定使用一个自定义视图,在用户不注意的情况下扩展导航栏 我已经创建了一个自定义视图,添加到导航栏的底部。我把它涂成红色只是为了把这个问题弄清楚。当用户离开视图控制器然后返回时,标题视图自定义视图被红色视图“剪裁”。为什么? 我试图在自定义标题视图中将clipstobundsfalse设置为false,但没有帮助。如何确保自定义标题视图始终位于所有内容的顶部?为什么它被小红视图(其主要目的是“扩展”导航栏)剪裁和重叠 注

我需要扩展我的导航栏高度,但由于苹果在iOS 11中很难更改导航栏高度,我决定使用一个自定义视图,在用户不注意的情况下扩展导航栏

我已经创建了一个自定义视图,添加到导航栏的底部。我把它涂成红色只是为了把这个问题弄清楚。当用户离开视图控制器然后返回时,标题视图自定义视图被红色视图“剪裁”。为什么?

我试图在自定义标题视图中将
clipstobunds
false设置为false,但没有帮助。如何确保自定义标题视图始终位于所有内容的顶部?为什么它被小红视图(其主要目的是“扩展”导航栏)剪裁和重叠

注意:“每月支出”标签是标题视图的一部分

class ViewController: UIViewController {
    let customTitleView = CustomTitleView()

    let navigationBarExtensionView: UIView = {
        let view = UIView()
        view.backgroundColor = .red
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        setupAdditionalGradientView()
        navigationItem.titleView = customTitleView
    }

    internal func setupAdditionalGradientView() {
        view.addSubview(navigationBarExtensionView)
        navigationBarExtensionView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        navigationBarExtensionView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        navigationBarExtensionView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        navigationBarExtensionView.heightAnchor.constraint(equalToConstant: 18).isActive = true

        // Hide pixel shadow between nav bar and red bar
        navigationController?.navigationBar.shadowImage = UIImage()
        navigationController?.navigationBar.layer.shadowRadius = 0
        navigationController?.navigationBar.layer.shadowOffset = CGSize(width: 0, height: 0)
    }
}
自定义标题视图:

import UIKit

class CustomTitleView: UIView {

    let primaryLabel: UILabel = {
        let label = UILabel()
        label.text = "$10,675.00"
        label.font = UIFont.systemFont(ofSize: 27.99, weight: .medium)
        label.textColor = .white
        label.textAlignment = .center
        return label
    }()

    let secondaryLabel: UILabel = {
        let label = UILabel()
        label.text = "Monthly Spending"
        label.textColor = .white
        label.textAlignment = .center
        label.font = UIFont.systemFont(ofSize: 10, weight: .medium)
        return label
    }()

    let stackView: UIStackView = {
        let stackView = UIStackView()
        stackView.axis = .vertical
        stackView.distribution = .fillProportionally
        stackView.alignment = .center
        stackView.translatesAutoresizingMaskIntoConstraints = false
        return stackView
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupStackView()
    }

    internal func setupStackView() {
        addSubview(stackView)
        stackView.addArrangedSubview(primaryLabel)
        stackView.addArrangedSubview(secondaryLabel)
        stackView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
        stackView.centerYAnchor.constraint(equalTo: centerYAnchor, constant: 10).isActive = true
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}

在iOS 11中,自定义栏按钮项目视图(如
标题视图
)使用约束从内到外调整大小。因此,需要约束才能正确调整视图的大小。您没有提供任何约束,因此运行时不知道如何调整标题视图的大小


但是,我建议您放弃将UINavigationItem的自定义视图向下扩展到导航栏外部下方的想法,而只在视图控制器的视图中显示单词Monthly spend。

显示代码很好,但也有必要说明代码的去向。请记住,您的目标是允许其他人完全按照您的指示重现问题。如果这太难了,发布一个示例项目。谢谢@matt,用完整的代码更新了问题。在发布示例项目的过程中,这要好得多,我现在可以大致直观地看到您正在尝试做什么。当然,这是违法的,所以我并不奇怪会有麻烦。让我问一下:视图调试器告诉您什么?在看不到的情况下,每月支出在哪里?我记得上面说“CustomTitleView的位置和大小不明确”,brb再次检查哇,这真是天才。我从来没有想过在VC中显示这些文字。