Rembourrage de text sur UILabel

Ici, j'essaie d'avoir une label avec un peu de rembourrage (gauche, droite, haut et bas) autour du text. Ce problème a été rapporté sur SOF et après avoir lu quelques-uns d'entre eux, j'ai essayé d'utiliser une solution proposée ici :

Voici le code de mon sous-class UILabel:

import UIKit class LuxLabel: UILabel { //let padding: UIEdgeInsets var padding: UIEdgeInsets = UIEdgeInsets.zero { didSet { self.invalidateInsortingnsicContentSize() } } // Create a new PaddingLabel instance programamtically with the desired insets required init(padding: UIEdgeInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10)) { self.padding = padding super.init(frame: CGRect.zero) } // Create a new PaddingLabel instance programamtically with default insets override init(frame: CGRect) { padding = UIEdgeInsets.zero // set desired insets value according to your needs super.init(frame: frame) } // Create a new PaddingLabel instance from Storyboard with default insets required init?(coder aDecoder: NSCoder) { padding = UIEdgeInsets.zero // set desired insets value according to your needs super.init(coder: aDecoder) } override func drawText(in rect: CGRect) { super.drawText(in: UIEdgeInsetsInsetRect(rect, padding)) } // Override `insortingnsicContentSize` property for Auto layout code override var insortingnsicContentSize: CGSize { let superContentSize = super.insortingnsicContentSize let width = superContentSize.width + padding.left + padding.right let heigth = superContentSize.height + padding.top + padding.bottom return CGSize(width: width, height: heigth) } } 

Il est basé sur PaddingLabel (voir le lien ci-dessus).

Cela fonctionne surtout bien, mais pour certaines raisons que je ne comprends pas, il y a des cas où les choses tournent mal et l'affichage est tronqué.

Ceci est un exemple:

La string à mettre sur l'label est:

"Il a une forme carrée et une couleur bleue."

Le code pour créer l'label est:

 let label = LuxLabel(padding: UIEdgeInsets(top: 5, left: 10, bottom: 5, right: 10)) label.numberOfLines = 0 

et voici le résultat:

entrez la description de l'image ici

Si j'ajoute cette ligne aux deux ci-dessus:

label.lineBreakMode = .byWordWrapping

le résultat est:

entrez la description de l'image ici

J'ai également mis quelques contraintes. Tout cela fonctionne 95% du time. Quelqu'un peut-il voir quel est le problème?

Essayez d'appeler invalidateInsortingnsicContentSize:

 var padding: UIEdgeInsets = UIEdgeInsets.zero { didSet { self.invalidateInsortingnsicContentSize() } } 

MODIFIER:

J'ai essayé différentes options. Si vous mettez à jour la frame size l' frame size avec insortingnsicContentSize dans layoutSubviews mais je ne sais pas s'il existe une meilleure façon de le faire:

 override func layoutSubviews() { super.layoutSubviews() self.frame.size = self.insortingnsicContentSize }