Swift 4: 无法以编程方式更改导航栏的高度
Swift 4: Unable to programmatically change the height on my Navigation Bar
我正在为 ViewController 设置一个自定义导航栏。问题是Navigation Bar太小了,我无法改变它的高度。
class AddGameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = Color.lightGrey
self.setNavigationBar()
}
func setNavigationBar() {
let screenSize: CGRect = UIScreen.main.bounds
let navBar = UINavigationBar(frame: CGRect(x: 0, y: 0, width: screenSize.width, height: 50))
let navItem = UINavigationItem(title: "Create Game")
let doneItem = UIBarButtonItem(image: UIImage(named: "Cancel"), style: .plain, target: self, action: #selector(cancelGameCreation))
navItem.leftBarButtonItem = doneItem
navBar.setItems([navItem], animated: false)
self.view.addSubview(navBar)
}
@objc func cancelGameCreation() {
dismiss(animated: true, completion: nil)
}
}
导航栏的高度是固定的。看起来你把它放在了状态栏的顶部。尝试使用约束将导航栏的顶部固定到状态栏的底部。
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.lightGray
self.setNavigationBar()
}
func setNavigationBar() {
let navBar = UINavigationBar()
navBar.translatesAutoresizingMaskIntoConstraints = false
let navItem = UINavigationItem(title: "Create Game")
let doneItem = UIBarButtonItem(image: UIImage(named: "Cancel"), style: .plain, target: self, action: #selector(cancelGameCreation))
navItem.leftBarButtonItem = doneItem
navBar.setItems([navItem], animated: false)
self.view.addSubview(navBar)
if #available(iOS 11, *) {
let guide = view.safeAreaLayoutGuide
navBar.topAnchor.constraint(equalTo: guide.topAnchor).isActive = true
} else {
navBar.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor).isActive = true
}
navBar.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
navBar.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
navBar.heightAnchor.constraint(equalToConstant: 600).isActive = true
}
@objc func cancelGameCreation() {
dismiss(animated: true, completion: nil)
}
}
使用锚点,您可以按照 Tommi 上面的建议将您创建的导航固定到状态栏的底部。
话虽这么说,但我在您上面展示的设计中并没有看到太多无法通过调整导航控制器上的导航栏外观来处理的情况。您决定构建自己的导航栏而不是将视图控制器添加到导航控制器并设置栏按钮项和该导航栏上的标题是否有原因。导航控制器应该会处理您看到的约束问题。
假设将视图控制器添加到导航控制器的快速示例如下所示:(只是一个想法,希望这有帮助)
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.lightGray
navigationItem.title = "Create Game"
let doneItem = UIBarButtonItem(image: UIImage(named: "Cancel"), style: .plain, target: self, action: #selector(cancelGameCreation))
navigationItem.setLeftBarButton(doneItem, animated: false)
navigationController?.navigationBar.barTintColor = UIColor.blue
}
@objc func cancelGameCreation() {
dismiss(animated: true, completion: nil)
}
}
我正在为 ViewController 设置一个自定义导航栏。问题是Navigation Bar太小了,我无法改变它的高度。
class AddGameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = Color.lightGrey
self.setNavigationBar()
}
func setNavigationBar() {
let screenSize: CGRect = UIScreen.main.bounds
let navBar = UINavigationBar(frame: CGRect(x: 0, y: 0, width: screenSize.width, height: 50))
let navItem = UINavigationItem(title: "Create Game")
let doneItem = UIBarButtonItem(image: UIImage(named: "Cancel"), style: .plain, target: self, action: #selector(cancelGameCreation))
navItem.leftBarButtonItem = doneItem
navBar.setItems([navItem], animated: false)
self.view.addSubview(navBar)
}
@objc func cancelGameCreation() {
dismiss(animated: true, completion: nil)
}
}
导航栏的高度是固定的。看起来你把它放在了状态栏的顶部。尝试使用约束将导航栏的顶部固定到状态栏的底部。
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.lightGray
self.setNavigationBar()
}
func setNavigationBar() {
let navBar = UINavigationBar()
navBar.translatesAutoresizingMaskIntoConstraints = false
let navItem = UINavigationItem(title: "Create Game")
let doneItem = UIBarButtonItem(image: UIImage(named: "Cancel"), style: .plain, target: self, action: #selector(cancelGameCreation))
navItem.leftBarButtonItem = doneItem
navBar.setItems([navItem], animated: false)
self.view.addSubview(navBar)
if #available(iOS 11, *) {
let guide = view.safeAreaLayoutGuide
navBar.topAnchor.constraint(equalTo: guide.topAnchor).isActive = true
} else {
navBar.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor).isActive = true
}
navBar.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
navBar.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
navBar.heightAnchor.constraint(equalToConstant: 600).isActive = true
}
@objc func cancelGameCreation() {
dismiss(animated: true, completion: nil)
}
}
使用锚点,您可以按照 Tommi 上面的建议将您创建的导航固定到状态栏的底部。
话虽这么说,但我在您上面展示的设计中并没有看到太多无法通过调整导航控制器上的导航栏外观来处理的情况。您决定构建自己的导航栏而不是将视图控制器添加到导航控制器并设置栏按钮项和该导航栏上的标题是否有原因。导航控制器应该会处理您看到的约束问题。
假设将视图控制器添加到导航控制器的快速示例如下所示:(只是一个想法,希望这有帮助)
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.lightGray
navigationItem.title = "Create Game"
let doneItem = UIBarButtonItem(image: UIImage(named: "Cancel"), style: .plain, target: self, action: #selector(cancelGameCreation))
navigationItem.setLeftBarButton(doneItem, animated: false)
navigationController?.navigationBar.barTintColor = UIColor.blue
}
@objc func cancelGameCreation() {
dismiss(animated: true, completion: nil)
}
}