J'ai créé une classe personnalisée pour UIButton
mais sur des appareils à petit écran, par exemple iPhone 5s
cornerRadius
ne fonctionne pas correctement
Vous devez regarder de plus près pour voir le cornerRadius
du UiButton
n'est pas parfaitement arrondi
class customRoundButton: UIButton { override func awakeFromNib() { self.layer.cornerRadius = (self.layer.frame.height / 2) self.layer.borderColor = fontColor.defualtBlue.cgColor self.layer.borderWidth = 1 self.layer.clipsToBounds = true self.layer.layoutIfNeeded() } }
4 Réponses :
La définition du cornerRadius
dans awakeFromNib
est trop tôt. Utilisez plutôt layoutSubviews
:
class CustomRoundButton: UIButton { override func awakeFromNib() { super.awakeFromNib() layer.borderColor = UIColor.blue.cgColor layer.borderWidth = 1 } override func layoutSubviews() { super.layoutSubviews() layer.cornerRadius = layer.frame.height / 2 } }
Essayez
override func layoutSubviews() { super.layoutSubviews() self.layer.cornerRadius = self.bounds.height * 0.50 }
Ainsi, au moment où votre UIButton personnalisé sera ajouté aux sous-vues, il saura qu'il est limité et il vous suffira d'attribuer le rayon du coin à la moitié des limites hauteur.
Mieux vaut utiliser IBDesignable
pour cela:
@IBDesignable class RoundedButton: UIButton { @IBInspectable var cornerRadius: CGFloat = 3.0 { didSet { self.layer.cornerRadius = cornerRadius } } override func prepareForInterfaceBuilder() { super.prepareForInterfaceBuilder() self.setupView() } override func awakeFromNib() { super.awakeFromNib() self.setupView() } func setupView() { self.layer.masksToBounds = false self.layer.cornerRadius = cornerRadius } }
Je suis tombé sur cette question ici et j'ai trouvé que ce qui fonctionnait le mieux dans Swift 5 est de définir le rayon du coin dans awakeFromNib
dans Disptatch.main.async
Lors de l'utilisation de layoutSubviews
ou setNeedsLayout
la fermeture est appelée pour chaque petit changement ou mouvement. Cela peut fonctionner pour certains cas d'utilisation. Je n'ai pas essayé cela avec l'exemple ci-dessus.
Mon code ressemble à ceci:
override func awakeFromNib() { super.awakeFromNib() imageView.layer.masksToBounds = false imageView.clipsToBounds = true DispatchQueue.main.async { self.imageView.layer.cornerRadius = self.imageView.bounds.height / 2.0 } }
Déplacez plutôt la ligne
self.layer.cornerRadius = (self.layer.frame.height / 2)
verslayoutSubviews
. Vous pouvez également supprimer la ligneself.layer.layoutIfNeeded ()
.exactement comme mentionné par @ AndréSlotta définissez le rayon de votre coin dans la méthode
func layoutSubviews ()
Pas de chance, ça ne marchera pas.
@Bhavesh Pouvez-vous montrer votre code mis à jour alors?
@Bhavesh, il n'y a pas de chance ici. Est-ce que tu l'as essayé?
Mon problème est déjà résolu par @ AndréSlotta.