我正在尝试为导航栏创建自定义titleView。我可以在嵌入在导航控制器中的根视图控制器中设置titleView。
当我将第二个视图控制器推送到堆栈上并尝试为此视图控制器设置titleView时,它不起作用。titleView会迅速出现和消失。当我返回到上一个视图控制器时,这个titleView也很快出现和消失了。
有谁知道为什么会发生这种情况,或者如何正确设置titleView而不闪烁和消失?
class FirstViewController: UIViewController {
var titleView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
addTitleView()
}
func addTitleView() {
titleView = UIView(frame: CGRect(x: 0, y: 0, width: 150, height: 44))
let companyLabel = UILabel(frame: CGRect(x: 0, y: 3, width: 150, height: 11))
companyLabel.text = "CPS Dashboard"
companyLabel.textColor = UIColor.grayColor()
companyLabel.textAlignment = .Center
companyLabel.font = UIFont.systemFontOfSize(9)
titleView.addSubview(companyLabel)
let titleLabel = UILabel(frame: CGRect(x: 0, y: 16, width: 150, height: 18))
titleLabel.text = "Dashboard"
titleLabel.textColor = UIColor.blackColor()
titleLabel.textAlignment = .Center
titleLabel.font = UIFont.systemFontOfSize(15)
titleView.addSubview(titleLabel)
navigationItem.titleView = titleView
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "Show" {
let controller = segue.destinationViewController as! SecondViewController
controller.titleView = titleView
}
}
}第二个视图控制器:
class SecondViewController: UIViewController {
var titleView: UIView?
override func viewDidLoad() {
super.viewDidLoad()
if let titleView = titleView {
navigationItem.titleView = titleView
}
}
}发布于 2015-11-23 23:43:46
我找到了一个解决方案。我将addTitleView()方法从FirstViewController复制到SecondViewController中,并在viewDidLoad()中调用这两个方法。这就是我想要的效果。由于某些原因,将titleView作为属性向前传递并将其分配给navigationItem.titleView是行不通的。
class FirstViewController: UIViewController {
var titleView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
addTitleView()
}
func addTitleView() {
titleView = UIView(frame: CGRect(x: 0, y: 0, width: 150, height: 44))
let companyLabel = UILabel(frame: CGRect(x: 0, y: 3, width: 150, height: 11))
companyLabel.text = "CPS Dashboard"
companyLabel.textColor = UIColor.grayColor()
companyLabel.textAlignment = .Center
companyLabel.font = UIFont.systemFontOfSize(9)
titleView.addSubview(companyLabel)
let titleLabel = UILabel(frame: CGRect(x: 0, y: 16, width: 150, height: 18))
titleLabel.text = "Dashboard"
titleLabel.textColor = UIColor.blackColor()
titleLabel.textAlignment = .Center
titleLabel.font = UIFont.systemFontOfSize(15)
titleView.addSubview(titleLabel)
navigationItem.titleView = titleView
}
}第二个视图控制器:
class SecondViewController: UIViewController {
var titleView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
addTitleView()
}
func addTitleView() {
titleView = UIView(frame: CGRect(x: 0, y: 0, width: 150, height: 44))
let companyLabel = UILabel(frame: CGRect(x: 0, y: 3, width: 150, height: 11))
companyLabel.text = "CPS Dashboard"
companyLabel.textColor = UIColor.grayColor()
companyLabel.textAlignment = .Center
companyLabel.font = UIFont.systemFontOfSize(9)
titleView.addSubview(companyLabel)
let titleLabel = UILabel(frame: CGRect(x: 0, y: 16, width: 150, height: 18))
titleLabel.text = "Dashboard"
titleLabel.textColor = UIColor.blackColor()
titleLabel.textAlignment = .Center
titleLabel.font = UIFont.systemFontOfSize(15)
titleView.addSubview(titleLabel)
navigationItem.titleView = titleView
}
}发布于 2017-07-15 22:15:55
我的解决方案很简单,而且很管用:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if let tv = navigationItem.titleView {
print("transform", tv.transform)) // is always identity
let bounds = tv.bounds
print("bounds", bounds) // its origin may not be zero.
tv.bounds = CGRect(origin: .zero, size: bounds.size)
print("new bounds", tv.bounds)
}
}使用Xcode的视图调试器,您会发现titleView.bounds.origin不是零。
如何让它再次发生,两个步骤: 1. UIViewController A和B;A有自定义的navigationItem.titleView,B将navigationBar隐藏在它的viewWillAppear()中;当B弹出时,A.viewWillAppear() setNavigationBar(隐藏: false,navigationBar:true) 2.举手取消用户驱动的popViewController。
然后你会发现,A的navigationBar是空的。
发布于 2019-10-31 01:53:07
我也遇到了同样的问题,但上面的解决方案都没有解决这个问题。我的问题是我将translatesAutoresizingMaskIntoConstraints设置为false。我认为这会导致出现/消失,因为需要将其设置为true,以便在内部将视图约束到导航栏。
https://stackoverflow.com/questions/33861952
复制相似问题