J'ai vu des réponses au redimensionnement vertical impliquant la mise en mémoire automatique, mais les UILabel
s 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)
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.
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:
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.