129 votes

Comment faire un simple bouton arrondi dans Storyboard ?

Je viens de commencer à apprendre le développement iOS, je ne trouve pas comment faire un simple bouton arrondi. Je trouve des ressources pour les anciennes versions. Dois-je définir un arrière-plan personnalisé pour un bouton ? Dans Android, j'utiliserais simplement un patch 9, mais je sais que iOS n'a pas cette capacité.

enter image description here

267voto

Nishant Points 678

Réponse courte : OUI

Vous pouvez tout à fait créer un simple bouton arrondi sans avoir besoin d'une image d'arrière-plan supplémentaire ou d'écrire un quelconque code à cet effet. Il suffit de suivre la capture d'écran ci-dessous, pour définir les attributs d'exécution du bouton, afin d'obtenir le résultat souhaité.

Il n'apparaîtra pas dans le Storyboard mais cela fonctionnera bien lorsque vous exécuterez le projet.

enter image description here

Note :
Le site Chemin clé layer.cornerRadius et la valeur est 5. La valeur doit être modifiée en fonction de la hauteur et de la largeur du bouton. La formule est la hauteur du bouton * 0,50. Jouez donc sur la valeur pour voir le bouton arrondi attendu dans le simulateur ou sur le dispositif physique. Cette procédure peut sembler fastidieuse si vous avez plus d'un bouton à arrondir dans le storyboard.

15 votes

Veuillez ajouter un commentaire lors du vote négatif.

10 votes

Il est décevant que l'IB ne puisse pas présenter cette application comme une application de dessin ordinaire.

2 votes

@WilliamCerniuk : En fait, c'est possible. Regardez nshipster.com/ibinspectable-ibdesignable

94voto

ChikabuZ Points 600

Vous pouvez faire quelque chose comme ça :

@IBDesignable class MyButton: UIButton
{
    override func layoutSubviews() {
        super.layoutSubviews()

        updateCornerRadius()
    }

    @IBInspectable var rounded: Bool = false {
        didSet {
            updateCornerRadius()
        }
    }

    func updateCornerRadius() {
        layer.cornerRadius = rounded ? frame.size.height / 2 : 0
    }
}

Définissez la classe sur MyButton en Identity Inspector et à l'IB, vous aurez rounded propriété :

enter image description here

6 votes

De loin la meilleure réponse. J'ai appris quelque chose de nouveau aujourd'hui, c'est génial !

2 votes

Cette réponse n'est pas complète. Lorsque vous lancez votre application, xCode utilise la taille d'image de la vue dans le constructeur d'interface, et non la taille d'image réelle lorsque l'application est en cours d'exécution.

2 votes

Vous pouvez également utiliser "didSet" au lieu de "willSet" et supprimer l'argument isRounded.

91voto

realtimez Points 88

Pour le faire dans le storyboard, vous devez utiliser une image pour le bouton.

Vous pouvez également le faire en code :

 btn.layer.cornerRadius = 10
 btn.clipsToBounds = true

2 votes

Pourquoi la fonction clipsToBounds est-elle nécessaire ? Il semble que l'ombre ne fonctionne pas tant que je ne la supprime pas.

1 votes

Bonne réponse, mais vous pouvez le faire en IB, sans images. Voir ci-dessous.

39voto

anson Points 510
  1. Créez une classe Cocoa Touch.

enter image description here

  1. Insérez le code dans la classe RoundButton.

    import UIKit
    
    @IBDesignable
    class RoundButton: UIButton {
    
        @IBInspectable var cornerRadius: CGFloat = 0{
            didSet{
            self.layer.cornerRadius = cornerRadius
            }
        }
    
        @IBInspectable var borderWidth: CGFloat = 0{
            didSet{
                self.layer.borderWidth = borderWidth
            }
        }
    
        @IBInspectable var borderColor: UIColor = UIColor.clear{
            didSet{
                self.layer.borderColor = borderColor.cgColor
            }
        }
    }
  2. Référez-vous à l'image.

enter image description here

0 votes

Je ne sais pas si d'autres ont rencontré ce problème, mais dès que j'ai défini la classe d'un bouton et que je lui ai donné un rayon, une largeur de bordure et une couleur de bordure, Xcode (9.2) affiche une erreur indiquant qu'il y a eu une erreur de rendu. La construction de l'application réussit mais le " !" rouge continue à s'afficher. Juste pour dire... Je suis revenu à la solution du code seul (bien que ce soit vraiment un moyen élégant).

14voto

frankkie12345 Points 171

J'ai trouvé le moyen le plus simple de le faire, en fixant le cornerRadius à la moitié de la hauteur de la vue.

button.layer.cornerRadius = button.bounds.size.height/2

0 votes

Non, je ne l'ai pas fait. Si la hauteur et la largeur sont identiques (ce qui aurait été carré), alors vous obtiendrez un cercle. Mais si la largeur est supérieure à la hauteur, le bouton sera correct.

2 votes

Vous avez raison, j'ai raté l'image incluse dans la question qui montre ce que le posteur recherchait en fait correspond à votre réponse plus qu'à la réponse acceptée - upvote

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X