web-dev-qa-db-fra.com

Changer UIButton BorderColor dans le scénarimage

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).

enter image description here

67
Jaleel Nazir

Pour Swift: 

 enter image description here

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
        }
    }
}
141
Jaleel Nazir

J'ai eu Réponse Changer layer.borderColor à layer.borderColorFromUIColor

enter image description here

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

Attribute Inspector

75
Jaleel Nazir

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:

 enter image description here

Les modifications sont également reflétées dans les attributs d'exécution définis par l'utilisateur:

 enter image description here

Courez dans le temps de construction et le tour est joué! vous verrez votre bouton arrondi clair avec bordure.

 enter image description here

36
Cons Bulaquena

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.

7
pkamb

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
        }
    }
}
0
Furqan Khan

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.

0
cdeerinck

Cela fonctionne pour moi.

Swift 3, Xcode 8.3

Identity inspector (UIButton in this case

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

}

0
Jovan Stankovic