web-dev-qa-db-fra.com

swift: crée par programme une largeur fixe UILabel qui se redimensionne verticalement selon la longueur du texte

J'ai vu des réponses au redimensionnement vertical impliquant la mise en mémoire automatique, mais les UILabels que je crée ne sont nécessaires qu'à l'exécution. (Je pourrais avoir besoin de zéro à plusieurs de ces étiquettes.)

Exemples (ignorer la couleur)

  1. Texte court (notez la même largeur que le texte plus long):

 enter image description here

  1. Texte plus long (notez la même largeur que l'exemple de texte plus court avec plus de lignes pour le texte ajouté):

 enter image description here

Si le texte peut tenir dans une ligne de largeur fixe, il ne devrait pas être nécessaire de redimensionner l'étiquette. Mais s'il y a plus de caractères, l'étiquette doit continuer à se développer verticalement pour s'adapter à ces caractères supplémentaires. Le texte devrait continuer à se dérouler ligne après ligne. Le texte doit commencer dans le coin supérieur gauche de l'étiquette.

Pour être plus précis:

let marker = GMSMarker(position: myLatLng)
// see http://stackoverflow.com/a/40211383/1168364 for imageWithView
marker.icon = imageWithView(label) // **how do i create this label?**
marker.map = map // map is a GMSMapView

Ces étiquettes peuvent être n'importe où sur l'écran. Ceci est pour une application de carte où chaque étiquette sera placée à un emplacement aléatoire. Les emplacements des étiquettes n'ont pas de relation les uns avec les autres.

7
lf215

Il existe deux méthodes utiles pour UIView: sizeToFit () et sizeThatFits (_ :)

Le premier redimensionne une vue à une taille minimale pour l'adapter au contenu des sous-vues et le second ne modifie pas du tout le cadre, mais renvoie la taille calculée qui: (1) convient à toutes les sous-vues et (2) ne dépasse pas le paramètre size

Vous pouvez donc utiliser sizeThatFits à vos fins:

let label = UILabel()

override func viewDidLoad() {
    super.viewDidLoad()

    label.backgroundColor = UIColor.orange
    label.textColor = UIColor.white
//  label.text = "ultimate Frisbee"
    label.text = "ultimate Frisbee\nin 3 minutes,\nall welcome|2"
    label.numberOfLines = 10
    view.addSubview(label)

    updateLabelFrame()
}

func updateLabelFrame() {
    let maxSize = CGSize(width: 150, height: 300)
    let size = label.sizeThatFits(maxSize)
    label.frame = CGRect(Origin: CGPoint(x: 100, y: 100), size: size)
}

Sortie:

 enter image description here  enter image description here

P.S. Vous pouvez également résoudre votre problème avec des contraintes d’autolayout, mais je ne suis pas un grand fan de les utiliser par programmation.

11
alexburtnik