I Définissez CornerRadius et BorderWidth for UIbutton dans les attributs d'exécution définis par l'utilisateur. Sans ajouter layer.borderColor cela fonctionne bien et afficher la bordure en couleur noire. Mais lorsque vous ajoutez layer.borderColor ne fonctionne pas (ne montre pas de bordure).
Pour Swift:
Swift 3:
extension UIView {
@IBInspectable var cornerRadius: CGFloat {
get {
return layer.cornerRadius
}
set {
layer.cornerRadius = newValue
layer.masksToBounds = newValue > 0
}
}
@IBInspectable var borderWidth: CGFloat {
get {
return layer.borderWidth
}
set {
layer.borderWidth = newValue
}
}
@IBInspectable var borderColor: UIColor? {
get {
return UIColor(cgColor: layer.borderColor!)
}
set {
layer.borderColor = newValue?.cgColor
}
}
}
Swift 2.2:
extension UIView {
@IBInspectable var cornerRadius: CGFloat {
get {
return layer.cornerRadius
}
set {
layer.cornerRadius = newValue
layer.masksToBounds = newValue > 0
}
}
@IBInspectable var borderWidth: CGFloat {
get {
return layer.borderWidth
}
set {
layer.borderWidth = newValue
}
}
@IBInspectable var borderColor: UIColor? {
get {
return UIColor(CGColor: layer.borderColor!)
}
set {
layer.borderColor = newValue?.CGColor
}
}
}
J'ai eu Réponse Changer layer.borderColor à layer.borderColorFromUIColor
et ajoutez le code dans le fichier .m
#import <QuartzCore/QuartzCore.h>
@implementation CALayer (Additions)
- (void)setBorderColorFromUIColor:(UIColor *)color
{
self.borderColor = color.CGColor;
}
@end
Tick Propriétés dans l'inspecteur d'attributs
Swift 4, Xcode 9.2 - Utilisez IBDesignable
et IBInspectable
pour créer des contrôles personnalisés et prévisualiser en direct la conception dans Interface Builder.
Voici un exemple de code dans Swift, placé juste en dessous de la UIKit
dans ViewController.Swift:
@IBDesignable extension UIButton {
@IBInspectable var borderWidth: CGFloat {
set {
layer.borderWidth = newValue
}
get {
return layer.borderWidth
}
}
@IBInspectable var cornerRadius: CGFloat {
set {
layer.cornerRadius = newValue
}
get {
return layer.cornerRadius
}
}
@IBInspectable var borderColor: UIColor? {
set {
guard let uiColor = newValue else { return }
layer.borderColor = uiColor.cgColor
}
get {
guard let color = layer.borderColor else { return nil }
return UIColor(cgColor: color)
}
}
}
Si vous allez dans les attributs inspectables de la vue, vous devriez trouver ces propriétés visuellement, éditez les propriétés:
Les modifications sont également reflétées dans les attributs d'exécution définis par l'utilisateur:
Courez dans le temps de construction et le tour est joué! vous verrez votre bouton arrondi clair avec bordure.
L'explication, peut-être perdue dans certaines des autres réponses ici:
La raison pour laquelle cette propriété n'est pas définie est que layer.borderColor
a besoin d'une valeur de type CGColor
.
Mais seuls les types UIColor
peuvent être définis via les attributs d'exécution définis par l'utilisateur d'Interface Builder!
Par conséquent, vous devez définir une propriété UIColor sur une propriété proxy via Interface Builder, puis intercepter cet appel pour définir l'équivalent CGColor sur la propriété layer.borderColor
.
Cela peut être accompli en créant une catégorie sur CALayer, en définissant le chemin d'accès de la clé sur une nouvelle "propriété" unique (borderColorFromUIColor
) et en remplaçant le paramètre correspondant (setBorderColorFromUIColor:
) par la catégorie.
Dans le cas de Swift, la fonction ne fonctionne pas. Vous aurez besoin d'une propriété calculée pour obtenir le résultat souhaité:
extension CALayer {
var borderColorFromUIColor: UIColor {
get {
return UIColor(CGColor: self.borderColor!)
} set {
self.borderColor = newValue.CGColor
}
}
}
Il y a une bien meilleure façon de faire ça! Vous devriez utiliser @IBInspectable. Découvrez l'entrée de blog de Mike Woelmer ici: https://spin.atomicobject.com/2017/07/18/Swift-interface-builder/
Il ajoute en fait la fonctionnalité à IB dans xCode! Certaines des captures d'écran dans d'autres réponses donnent l'impression que les champs existent dans IB, mais pas dans xCode 9 au moins. Mais après son post va les ajouter.
Cela fonctionne pour moi.
Swift 3, Xcode 8.3
Extension CALayer:
extension CALayer {
var borderWidthIB: NSNumber {
get {
return NSNumber(value: Float(borderWidth))
}
set {
borderWidth = CGFloat(newValue.floatValue)
}
}
var borderColorIB: UIColor? {
get {
return borderColor != nil ? UIColor(cgColor: borderColor!) : nil
}
set {
borderColor = newValue?.cgColor
}
}
var cornerRadiusIB: NSNumber {
get {
return NSNumber(value: Float(cornerRadius))
}
set {
cornerRadius = CGFloat(newValue.floatValue)
}
}
}