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.