2016-09-12 4 views
8

ich benutzerdefinierte Navigationsleiste Höhe realisiert, durch Subklassen es mit dem Code folgendeniOS 10 benutzerdefinierte Navigationsleiste Höhe

class TMNavigationBar: UINavigationBar { 

    ///The height you want your navigation bar to be of 
    static let navigationBarHeight: CGFloat = 44.0 

    ///The difference between new height and default height 
    static let heightIncrease:CGFloat = navigationBarHeight - 44 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     initialize() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     initialize() 
    } 

    private func initialize() { 
     let shift = TMNavigationBar.heightIncrease/2 

     ///Transform all view to shift upward for [shift] point 
     self.transform = 
      CGAffineTransformMakeTranslation(0, -shift) 
    } 

    override func layoutSubviews() { 
     super.layoutSubviews() 

     let shift = TMNavigationBar.heightIncrease/2 

     ///Move the background down for [shift] point 
     let classNamesToReposition: [String] = ["_UINavigationBarBackground"] 
     for view: UIView in self.subviews { 
      if classNamesToReposition.contains(NSStringFromClass(view.dynamicType)) { 
       let bounds: CGRect = self.bounds 
       var frame: CGRect = view.frame 
       frame.origin.y = bounds.origin.y + shift - 20.0 
       frame.size.height = bounds.size.height + 20.0 
       view.frame = frame 
      } 
     } 
    } 

    override func sizeThatFits(size: CGSize) -> CGSize { 
     let amendedSize:CGSize = super.sizeThatFits(size) 
     let newSize:CGSize = CGSizeMake(amendedSize.width, TMNavigationBar.navigationBarHeight); 
     return newSize; 
    } 
} 

Problem Nach tritt nur auf iOS-10: (schwarzer Raum zwischen Bar & Ansicht)

enter image description here

Keine Ahnung, was dort passiert. Aber im Storyboard wird diese Warnung generiert, und es gibt keine Möglichkeit, sie in IB zu beheben (Warnung erscheint nur, wenn ich die Unterklasse der Navigationsleiste in IB ändere).

enter image description here

+1

Die Storyboard Warnung ist über die Breite, nicht Höhe. Und es hat nichts mit deinem Code zu tun. - Was ist das Problem_? Du sagst "folgendes Problem", aber du sagst nie, was es ist. – matt

+0

Bitte aktualisierten Screenshot sehen, es zeigt schwarzen Raum zwischen Ansicht & navBar – ignotusverum

+0

Also, was verursacht den schwarzen Raum? Ist der untere Rand der Navigationsleiste zu hoch oder ist der obere Teil der Ansicht zu niedrig? Sie haben einen Debugger. Debuggen! Verwenden Sie in diesem Fall den View Debugger, um zu sehen, wie Ihre View-Frames aussehen. – matt

Antwort

11

Ich habe Schnittstelle Debugger und das ist, was ich sehe (also im Grunde Navigationsleiste Höhe zu ändern, es versucht, biss es bleibt gleich und es ist nur schwarzen Raum zeigt - die Fensterfarbe ist):

enter image description here

Bei späteren Untersuchung stellte ich fest, dass es nicht ruft: „_UINavigationBarBackground

Dann überprüfte ich view.classForCoder aus schnell en umeration, und entdeckte, dass Schlüssel zum "_UIBarBackground" geändert wird, so dass ich layoutSubviews aktualisiert():

override func layoutSubviews() { 
    super.layoutSubviews() 

    let shift = TMNavigationBar.heightIncrease/2 

    ///Move the background down for [shift] point 
    let classNamesToReposition = isIOS10 ? ["_UIBarBackground"] : ["_UINavigationBarBackground"] 

    for view: UIView in self.subviews { 

     if classNamesToReposition.contains(NSStringFromClass(view.classForCoder)) { 
      let bounds: CGRect = self.bounds 
      var frame: CGRect = view.frame 
      frame.origin.y = bounds.origin.y + shift - 20.0 
      frame.size.height = bounds.size.height + 20.0 
      view.frame = frame 
     } 
    } 
} 

Beifall.

+0

Das funktioniert nicht für mich. Ich folge den genauen Schritten, die Sie vorgeschlagen haben. Ich habe festgestellt, dass der Cursor alle Stellen in der obigen Klasse durchläuft, aber es ruft niemals 'override func sizeThatFits (Größe: CGSize) -> CGSize {...}' auf, so dass ich die aktualisierte Höhe nicht sehen konnte? Irgendeine Idee? – Hemang

+0

Ich habe ein [gist] (https://gist.github.com/hemangshah/5698f7f1a931922831950319de4caa0e) dafür erstellt. Bitte schau es dir einmal an. – Hemang

15

Werke auf iOS 10, Swift 3.0:

extension UINavigationBar { 
    open override func sizeThatFits(_ size: CGSize) -> CGSize { 
     let screenRect = UIScreen.main.bounds 
     return CGSize(width: screenRect.size.width, height: 64) 
    } 
} 
+1

Danke! Ich habe mein Problem gelöst! :) –

+0

Wie benutzt man diese Erweiterungsfunktion? – Hemang

+0

@Hemang, fügen Sie es einfach in leere Extensions.swift Datei (und fügen Sie 'importieren UIKit' als erste Zeile) in Ihrem Projekt. –

Verwandte Themen