2017-09-20 51 views
8

Pracuję nad aplikacją i właśnie zaktualizowałem do Xcode 9/Swift 4, a także zaktualizowałem mój iPhone do iOS 11. Aplikacja została zainstalowana po zainstalowaniu systemu iOS 11 i wszystkie wydawały się OK, dopóki nie uruchomię go z Xcode. Teraz utknąłem z domyślną wysokością NavBar.iOS 11 - Nie można zmienić wysokości paska nawigacyjnego

Kod używałem do zmiany wysokości już nie działa:

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 
} 

tej pory jedyne co udało mi się znaleźć na ten temat to:

iOS 11 navigation bar height customizing

iOS11 customize navigation bar height

How to correctly set UINavigationBar height in iOS 11

Jednak dostarczone informacje nie pomagają, niestety.

Wszelkie pomysły/sugestie?

+0

Dlaczego nie można przejść do widoku niestandardowego zamiast "UINavigationBar"? –

+2

https://openradar.appspot.com/32912789 Wygląda na to, że zespół UIKit nigdy nie zamierzał używać 'UINavigationBar' do obsługi niestandardowych wysokości. Jeśli chcesz rozszerzyć rozmiar paska nawigacji, skorzystam z technik promowanych przez Apple tutaj: https://developer.apple.com/library/content/samplecode/NavBar/Introduction/Intro.html – beyowulf

+0

@mukesh_lokare - Początkowo NavBar Miał mieć standardową wysokość z obrazem logo w środku, więc zdecydowałem się użyć standardowego NavBarController. 30 ekranów i wiele zajęć później, ktoś zdecydował, że musi mieć niestandardową wysokość, więc zdecydowałem się użyć tej metody. – daydr3am3r

Odpowiedz

-2

Zaktualizowany 2017.10.6

Miałem ten sam problem. Poniżej znajduje się moje rozwiązanie. Zakładam, że wielkość wysokość wynosi 66.

Moje rozwiązanie działa poprawnie iOS 10, 11.

Proszę wybrać moją odpowiedź, czy to pomaga.

Tworzenie NavgationBar.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) 

      } 
     } 
    } 


} 

zestaw Storyboard klasę

enter image description here

Set NavigationBar class

Custom NavigationBar

Add TestView

enter image description here

Dodaj TestView + Zestaw 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. 
    } 



} 

enter image description here enter image description here

Żółty jest barbackgroundView. Czarny krycie to BarContentView.

Usunąłem również backgroundColor BarContentView.

enter image description here

to wszystko.

+0

Dzięki. Dam temu szansę. – daydr3am3r

+0

Dzięki. Ale top obszaru bezpiecznego nie jest aktualizowany. Górna część obszaru bezpieczeństwa nadal ma 44 piksele. Czy masz rozwiązanie? Nie wiem, jak zaktualizować top obszaru bezpiecznego po ustawieniu wysokości paska nawigacji. –

+0

Zaktualizowałem moją oryginalną odpowiedź. –