iOS 11 – 无法更改导航栏高度

我在一个应用程序上工作,我刚刚升级到Xcode 9 / Swift 4,并将我的iPhone升级到了iOS 11.当我安装了iOS 11时,应用程序已经安装好了,并且在我从Xcode运行它之前,所有的东西都没有问题。 现在我坚持默认的NavBar高度。

我用来更改高度的代码不再有效:

class CustomNavControllerVC: UINavigationController { let navBarHeight : CGFloat = 64.0 let navbarBackButtonColor = UIColor(red: 247/255, green: 179/255, blue: 20/255, alpha: 1) override func viewDidLoad() { super.viewDidLoad() print("CustomNavControllerVC > viewDidLoad") } override func viewDidLayoutSubviews() { print("CustomNavControllerVC > viewDidLayoutSubviews") super.viewDidLayoutSubviews() navigationBar.frame.size.height = navBarHeight navigationBar.tintColor = navbarBackButtonColor } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } // In my VCs override func viewDidLoad() { customizeNavBar() } func customizeNavBar() { let navbarBackItem = UIBarButtonItem() navbarBackItem.title = "Înapoi" navigationItem.backBarButtonItem = navbarBackItem let navbarImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 55, height: 20)) navbarImageView.contentMode = .scaleToFill let navbarLogo = UIImage(named: "NavBarLogo.png") navbarImageView.image = navbarLogo navigationItem.titleView = navbarImageView } 

到目前为止,我在这个问题上唯一能find的是:

iOS 11导航栏高度自定义

iOS11自定义导航栏高度

如何在iOS 11中正确设置UINavigationBar高度

但不幸的是,所提供的信息并没有帮助。

任何想法/build议?

更新2017.10.6

我有同样的问题。 以下是我的解决scheme。 我假设身高尺寸是66。

我的解决scheme工作正常iOS 10,11。

请select我的答案,如果它可以帮助你。

创buildNavgationBar.swift

 import UIKit class NavigationBar: UINavigationBar { //set NavigationBar's height var customHeight : CGFloat = 66 override func sizeThatFits(_ size: CGSize) -> CGSize { return CGSize(width: UIScreen.main.bounds.width, height: customHeight) } override func layoutSubviews() { super.layoutSubviews() frame = CGRect(x: frame.origin.x, y: 0, width: frame.size.width, height: customHeight) // title position (statusbar height / 2) setTitleVerticalPositionAdjustment(-10, for: UIBarMetrics.default) for subview in self.subviews { var stringFromClass = NSStringFromClass(subview.classForCoder) if stringFromClass.contains("BarBackground") { subview.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: customHeight) subview.backgroundColor = .yellow } stringFromClass = NSStringFromClass(subview.classForCoder) if stringFromClass.contains("BarContent") { subview.frame = CGRect(x: subview.frame.origin.x, y: 20, width: subview.frame.width, height: customHeight - 20) subview.backgroundColor = UIColor(red: 20/255, green: 20/255, blue: 20/255, alpha: 0.4) } } } } 

设置故事板

在这里输入图像说明

设置NavigationBar类

设置自定义NavigationBar类

添加TestView

在这里输入图像说明

添加TestView +设置SafeArea

ViewController.swift

 import UIKit class ViewController: UIViewController { var navbar : UINavigationBar! @IBOutlet weak var testView: UIView! override func viewDidLoad() { super.viewDidLoad() //update NavigationBar's frame self.navigationController?.navigationBar.sizeToFit() print("NavigationBar Frame : \(String(describing: self.navigationController!.navigationBar.frame))") } //Hide Statusbar override var prefersStatusBarHidden: Bool { return true } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(false) //Important! if #available(iOS 11.0, *) { //Default NavigationBar Height is 44. Custom NavigationBar Height is 66. So We should set additionalSafeAreaInsets to 66-44 = 22 self.additionalSafeAreaInsets.top = 22 } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 

SecondViewController.swift

 import UIKit class SecondViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. // Create BackButton var backButton: UIBarButtonItem! let backImage = imageFromText("Back", font: UIFont.systemFont(ofSize: 16), maxWidth: 1000, color:UIColor.white) backButton = UIBarButtonItem(image: backImage, style: UIBarButtonItemStyle.plain, target: self, action: #selector(SecondViewController.back(_:))) self.navigationItem.leftBarButtonItem = backButton self.navigationItem.leftBarButtonItem?.setBackgroundVerticalPositionAdjustment(-10, for: UIBarMetrics.default) } override var prefersStatusBarHidden: Bool { return true } @objc func back(_ sender: UITabBarItem){ self.navigationController?.popViewController(animated: true) } //Helper Function : Get String CGSize func sizeOfAttributeString(_ str: NSAttributedString, maxWidth: CGFloat) -> CGSize { let size = str.boundingRect(with: CGSize(width: maxWidth, height: 1000), options:(NSStringDrawingOptions.usesLineFragmentOrigin), context:nil).size return size } //Helper Function : Convert String to UIImage func imageFromText(_ text:NSString, font:UIFont, maxWidth:CGFloat, color:UIColor) -> UIImage { let paragraph = NSMutableParagraphStyle() paragraph.lineBreakMode = NSLineBreakMode.byWordWrapping paragraph.alignment = .center // potentially this can be an input param too, but i guess in most use cases we want center align let attributedString = NSAttributedString(string: text as String, attributes: [NSAttributedStringKey.font: font, NSAttributedStringKey.foregroundColor: color, NSAttributedStringKey.paragraphStyle:paragraph]) let size = sizeOfAttributeString(attributedString, maxWidth: maxWidth) UIGraphicsBeginImageContextWithOptions(size, false , 0.0) attributedString.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height)) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image! } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 

在这里输入图像说明 在这里输入图像说明

黄色是barbackgroundView。 黑色不透明是BarContentView。

我删除了BarContentView的backgroundColor。

在这里输入图像说明

而已。