2
votes

Le rayon d'angle UIButton ne fonctionne pas correctement dans CustomClass

J'ai créé une classe personnalisée pour UIButton mais sur des appareils à petit écran, par exemple iPhone 5s cornerRadius ne fonctionne pas correctement

Le bouton ressemble à ça

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()
    }
}


6 commentaires

Déplacez plutôt la ligne self.layer.cornerRadius = (self.layer.frame.height / 2) vers layoutSubviews . Vous pouvez également supprimer la ligne self.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.


4 Réponses :


7
votes

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
    }

}


0 commentaires

0
votes

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.


0 commentaires

0
votes

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
    }
}


0 commentaires

0
votes

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
        }
    }


0 commentaires