web-dev-qa-db-fra.com

Définir la taille UIView pour s'adapter aux sous-vues


J'ai un UIView qui contient deux UILabels, qui ont des hauteurs dynamiques. Je veux que le UIView s'adapte à la taille des UILabels + du rembourrage. En ce moment, je dessine les étiquettes, puis définit les contraintes de largeur et de hauteur de UIView sur la taille combinée des étiquettes.

En ce moment, je fais ceci:

func populateWithMessage(headline: String?, message: String) {
    // Sets text
    self.headerLabel.text = headline
    self.messageLabel.text = message

    self.headerLabel.sizeToFit()
    self.messageLabel.sizeToFit()

    self.layoutSubviews()

    // Finding the label with the greatest width
    var longestLabel: UILabel!
    if self.headerLabel.frame.width > self.messageLabel.frame.width {
       longestLabel = self.headerLabel
   } else {
       longestLabel = self.messageLabel
   }

   let combinedLabelHeight = self.headerLabel.frame.height + self.messageLabel.frame.height

   // Update the container view's constraints
   self.containerViewWidtConstraint.constant = longestLabel.frame.width + 10
   self.containerViewHeightConstraint.constant = combinedLabelHeight + 10

   self.updateConstraints()
}

Malheureusement ça ne marche pas: - /

Toutes les idées seront très appréciées!

J'utilise Swift 2.3 et Autolayout.

14
Nikolaj Nielsen

Vous pouvez le faire en utilisant le storyboard lui-même.

Définissez la contrainte inférieure de la vue sur le deuxième UIlabel. Ainsi, lorsque la hauteur de l'étiquette augmente, la hauteur de UIView augmente également.

enter image description here

enter image description here

27
miOS

La réponse @Girish M est correcte. Juste pour clarifier. Définissez la contrainte de l'étiquette supérieure sur la vue supérieure, l'espacement vertical entre les deux étiquettes et une contrainte inférieure entre l'étiquette inférieure et UIView. Ne définissez aucune contrainte de hauteur.

Alternativement, si vous voulez un peu plus de contrôle sur les hauteurs des UILabels, vous pouvez ajouter des contraintes de hauteur dans le storyboard pour les étiquettes et créer des sorties pour elles dans votre code. Exécutez ce code lors de la modification du texte des étiquettes.

    label1.sizeToFit()
    label2.sizeToFit()

    label1HeightConstraint.constant = label1.frame.size.height
    label2HeightConstraint.constant = label2.frame.size.height

    view.layoutSubviews()
4
Carien van Zyl