我正在关注this教程。 标题视图工作正常。左栏项目看起来不太好。我不知道为什么。
这是我的代码。
func setUpNavigationBarItems(){
//https://www.youtube.com/watch?v=zS-CCd4xmRY
let titleImageView = UIImageView(image: UIImage(named: "ic_nav_app_icon"))
titleImageView.frame = CGRect(x: 0, y: 0, width: 34, height: 34)
titleImageView.contentMode = .scaleAspectFit
navigationItem.titleView = titleImageView
let addButton = UIButton(type: .system)
let addImage = UIImage(named: "ic_nav_add")
addButton.setImage(addImage?.withRenderingMode(.alwaysOriginal), for: .normal)
addButton.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
navigationItem.leftBarButtonItem = UIBarButtonItem(customView: addButton)
}
答案 0 :(得分:2)
您正在设置的框架被“自动版式”否决了。
标题视图可能也是如此。如果您在运行时看一下它的框架,它的大小可能不会是h34 w34。这似乎是因为您设置了titleImageView.contentMode = .scaleAspectFit,这将使图像适合其框架而不会拉伸。
另一方面,左按钮显示为扭曲,因为您将图像添加到了UIButton上,该UIButton使用具有contentMode = .scaleAspectFill的UIImageView来显示图像(您可以通过使用视图调试器并检查导航项来自己查看) )。
要解决此问题,我建议使用自动版式来根据约束条件指定项目的大小:
func setUpNavigationBarItems(){
let titleImageView = UIImageView(image: UIImage(named: "ic_nav_app_icon"))
NSLayoutConstraint(item: titleImageView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 34).isActive = true
NSLayoutConstraint(item: titleImageView, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 34).isActive = true
titleImageView.contentMode = .scaleAspectFit
navigationItem.titleView = titleImageView
let addButton = UIButton(type: .system)
let addImage = UIImage(named: "ic_nav_add")
addButton.setImage(addImage?.withRenderingMode(.alwaysOriginal), for: .normal)
NSLayoutConstraint(item: addButton, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 30).isActive = true
NSLayoutConstraint(item: addButton, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 30).isActive = true
navigationItem.leftBarButtonItem = UIBarButtonItem(customView: addButton)
}