webentwicklung-frage-antwort-db.com.de

Ändern Sie UIButton BorderColor im Storyboard

Ich setze CornerRadius und BorderWidth für UIbutton in benutzerdefinierten Laufzeitattributen. Ohne das Hinzufügen von layer.borderColor funktioniert es gut und zeigt den Rand schwarz an. Aber wenn add layer.borderColor nicht funktioniert (zeigt keinen Rahmen an).

enter image description here

67
Jaleel Nazir

Für 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

Ich habe die Antwortänderung layer.borderColor in layer.borderColorFromUIColor erhalten.

enter image description here

und fügen Sie den Code in der .m-Datei hinzu

#import <QuartzCore/QuartzCore.h>
@implementation CALayer (Additions)

- (void)setBorderColorFromUIColor:(UIColor *)color
{
    self.borderColor = color.CGColor;
}

@end

Tick Eigenschaften im Attributinspektor

Attribute Inspector

75
Jaleel Nazir

Swift 4, Xcode 9.2 - Verwenden Sie IBDesignable und IBInspectable, um benutzerdefinierte Steuerelemente zu erstellen und das Design im Interface Builder in Live-Vorschau anzuzeigen.

Hier ist ein Beispielcode in Swift, der sich direkt unter der UIKit in ViewController.Swift befindet:

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

Wenn Sie zu den inspizierbaren Attributen der Ansicht wechseln, sollten Sie diese Eigenschaften visuell finden und die Eigenschaften bearbeiten:

 enter image description here

Die Änderungen spiegeln sich auch in benutzerdefinierten Laufzeitattributen wider:

 enter image description here

Laufen Sie in Bauzeit und Voila! Sie sehen Ihren abgerundeten Knopf mit Rand.

 enter image description here

36
Cons Bulaquena

Die Erklärung ist vielleicht in einigen anderen Antworten hier verloren gegangen:

Der Grund dafür, dass diese Eigenschaft nicht festgelegt wird, besteht darin, dass layer.borderColor einen Wert mit dem Typ CGColor benötigt.

Es können jedoch nur UIColor-Typen über die benutzerdefinierten Laufzeitattribute des Interface Builder festgelegt werden!

Sie müssen also eine UIColor über Interface Builder auf eine Proxy-Eigenschaft setzen und dann diesen Aufruf abfangen, um den entsprechenden CGColor auf die layer.borderColor-Eigenschaft festzulegen.

Dies kann erreicht werden, indem eine Kategorie in CALayer erstellt wird, der Schlüsselpfad auf eine eindeutige neue "Eigenschaft" (borderColorFromUIColor) festgelegt wird und in der Kategorie der entsprechende Setter (setBorderColorFromUIColor:) überschrieben wird.

7
pkamb

Bei Swift funktioniert die Funktion nicht. Sie benötigen eine berechnete Eigenschaft, um das gewünschte Ergebnis zu erzielen:

extension CALayer {
    var borderColorFromUIColor: UIColor {
        get {
            return UIColor(CGColor: self.borderColor!)
        } set {
            self.borderColor = newValue.CGColor
        }
    }
}
0
Furqan Khan

Es gibt einen viel besseren Weg, dies zu tun! Sie sollten @IBInspectable verwenden. Den Blogeintrag von Mike Woelmer finden Sie hier: https://spin.atomicobject.com/2017/07/18/Swift-interface-builder/

Es fügt das Feature tatsächlich zu IB in xCode hinzu! Einige der Screenshots in anderen Antworten lassen den Anschein erwecken, als wären die Felder in IB vorhanden, aber in xCode 9 ist dies nicht der Fall. Nach seinem Beitrag werden sie hinzugefügt.

0
cdeerinck

Das funktioniert bei mir.

Swift 3, Xcode 8.3

Identity inspector (UIButton in this case

CALayer-Erweiterung:

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