2017-08-24 2 views
1

Mise à jour: J'ai fini par cacher la barre de navigation par défaut et ajouté un UIView qui ressemble à la barre de navigation. Cela peut ne pas sembler bon mais au lieu de patcher dans le UINavigationBar c'est bon.Comment augmenter la hauteur pour une classe personnalisée UINavigationBar dans Swift


C'est ma classe personnalisée UINavigationBar que j'ai créé pour augmenter la hauteur de la barre de navigation dans mon application. Ça ne marche pas pour moi. Voici le code.

class PPBaseNavigationBar: UINavigationBar { 

    ///The height you want your navigation bar to be of 
    static let navigationBarHeight: CGFloat = 83.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 = PPBaseNavigationBar.heightIncrease/2.0 

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

    override func layoutSubviews() { 
     super.layoutSubviews() 

     let shift = PPBaseNavigationBar.heightIncrease/2.0 

     ///Move the background down for [shift] point 
     var classNamesToReposition: Array<String>? 
     if #available(iOS 10.0, *) { 
      classNamesToReposition = ["_UIBarBackground"] 
     } else { 
      classNamesToReposition = ["_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 
      } 
     } 
    } 

    override func sizeThatFits(_ size: CGSize) -> CGSize { 
     let amendedSize:CGSize = super.sizeThatFits(size) 
     let newSize:CGSize = CGSize.init(width: amendedSize.width, height: PPBaseNavigationBar.navigationBarHeight) 
     return newSize; 
    } 
} 

Toute la méthode est appelée, sauf override func sizeThatFits(_ size: CGSize) -> CGSize {...} ne sais pas, pourquoi?

+0

Avez-vous essayé d'ajouter une barre de navigation par programme? –

+0

Créer une référence de contrôleur de navigation, puis initez-la nouvelle référence sur NavBar .. Vous pouvez init navbar avec l'image –

+1

Salut Malav, merci pour la réponse bro. J'ai essayé les deux dans UIStoryboard et par programme mais n'a pas aidé. J'ai juste ajouté un 'UIView' en remplaçant la barre de navigation par défaut. C'est une bonne solution pour mon application. – Hemang

Répondre

3
It is not permissible to change the navigation bar object or modify its bounds, frame, or alpha values directly. 

Modifying the Navigation Bar Object Directly

Vous pouvez utiliser la vue personnalisée comme barre de navigation. Personnaliser l'affichage selon vos besoins (par exemple, la hauteur du changement) et masquer la barre de navigation par défaut comme

self.navigationController?.setNavigationBarHidden(true, animated: false) 
0

Changer votre code comme ci-dessous

open override func sizeThatFits(_ size: CGSize) -> CGSize { 
     let amendedSize:CGSize = super.sizeThatFits(size) 
     let newSize:CGSize = CGSize.init(width: amendedSize.width, height: PPBaseNavigationBar.navigationBarHeight) 
     return newSize; 
    } 

peut-être travaillé pour vous.

1

Essayez comme ça, cela a fonctionné pour moi Swift 3:

extension UINavigationBar { 

    override open func sizeThatFits(_ size: CGSize) -> CGSize { 
     return CGSize(width: UIScreen.main.bounds.size.width, height: "Your custom height") 
    } 

} 


// MARK: - View life cycle methods 

class DVNavigationController: UINavigationController { 

    override func viewWillLayoutSubviews() { 
     super.viewWillLayoutSubviews() 
     navigationBar.frame.size.height = "Your custom height" 
    } 

} 

Enfin attribuer cette classe personnalisée UINavigationController à votre navigationController. Fonctionne aussi bien outrepassent func sizeThatFits (_ size: CGSize)

1

layoutSubviews donc ne vous inquiétez pas si ce n'est pas sizeThatFits appelé. J'ai vérifié dans layoutSubviews La hauteur de la barre de navigation change.

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 + 150.0 
      view.frame = frame 
     } 
    }