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