2017-10-19 39 views
2

J'ai un projet avec un barre d'onglets et une barre de navigation pour chacun des onglets. Chacune des UIViews de la barre de navigation possède une constante de contrainte de hauteur définie dans le storyboard. Je voudrais sous-classer ce NSLayoutConstraint (pour la hauteur de Nav), de sorte qu'il change la hauteur pour l'iPhone X. La barre de navigation doit être beaucoup plus grande sur un iPhone X, et puisque je n'utilise pas "out" de la boîte "objets, mes contraintes doivent être définies manuellement.constante Subclassing NSLayoutConstraint basée sur la taille de l'écran

Essentiellement, je veux faire quelque chose comme ce qui suit dans la sous-classe, donc je ne pas répéter un tas de code et faire des sorties inutiles:

override func viewWillLayoutSubviews() { 
    navBarHeightConstraint.constant = navBarHeightConstraintConstant() 
} 

func navBarHeightConstraintConstant() -> CGFloat { 
    switch(UIScreen.main.bounds.height) { 
    case 812: // iPhone X 
     return 90 
    default: // all others 
     return 64 
    } 
} 

J'ai créé la sous-classe, mais ne Je ne sais pas quelles méthodes utiliser pour exécuter le code ci-dessus.

class NavHeightFixiPhoneXConstraint: NSLayoutConstraint { 

    // Nothing... yet! 

} 

Comment puis-je sous-classe NSLayoutConstraint pour qu'il affiche une valeur spécifique pour iPhone juste X?

Répondre

3

Vous pouvez remplacer la variable constante:

class NavHeightFixiPhoneXConstraint: NSLayoutConstraint { 

    override var constant: CGFloat { 
     set { 
      super.constant = newValue 
     } 
     get { 
      return navBarHeightConstant() 
     } 
    } 

    fileprivate func navBarHeightConstant() { 
     switch (UIScreen.main.bounds.height) { 
     case 812: 
      return 90 
     default: 
      return 64 
     } 
     layoutIfNeeded() 
    } 
} 
+0

attente, je viens obtenir « Impossible de remplacer la propriété mutable avec propriété en lecture seule « constante » » ... – Fattie

+0

Vous avez raison;) la propriété a getter et setter donc vous devez fournir les deux. Je vais éditer ma réponse. –

+0

Droit - je l'ai compris entre-temps! :) – Fattie