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 in schwarzer Farbe an. Aber wenn add layer.borderColor nicht funktioniert (zeigt keinen Rand).
ios
colors
uibutton
storyboard
Mohamed Jaleel Nazir
quelle
quelle
Ich habe eine Antwort bekommen. Ändern Sie borderColor anstelle von layer.borderColor :
und fügen Sie diesen Code in die .m-Datei ein:
#import <QuartzCore/QuartzCore.h> @implementation CALayer (Additions) - (void)setBorderColorFromUIColor:(UIColor *)color { self.borderColor = color.CGColor; } @end
Aktivieren Sie die Eigenschaften im Attributinspektor
quelle
Swift 4, Xcode 9.2 - Verwenden Sie
IBDesignable
undIBInspectable
, um benutzerdefinierte Steuerelemente zu erstellen und eine Live-Vorschau des Designs in Interface Builder anzuzeigen.Hier ist ein Beispielcode in Swift, der sich direkt unter dem
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 in der Ansicht überprüfbaren Attributen wechseln, sollten Sie diese Eigenschaften visuell finden und die Eigenschaften bearbeiten:
Die Änderungen werden auch in benutzerdefinierten Laufzeitattributen berücksichtigt:
Laufen Sie in der Bauzeit und Voila! Sie sehen Ihren klaren, abgerundeten Knopf mit Rand.
quelle
Die Erklärung, die vielleicht in einigen anderen Antworten hier verloren geht:
Der Grund, warum diese Eigenschaft nicht festgelegt wird, ist, dass
layer.borderColor
ein Wert mit Typ erforderlich istCGColor
.Es
UIColor
können jedoch nur Typen über die benutzerdefinierten Laufzeitattribute von Interface Builder festgelegt werden!Sie müssen also über Interface Builder eine UIColor für eine Proxy-Eigenschaft festlegen und dann diesen Aufruf abfangen, um die entsprechende CGColor für die
layer.borderColor
Eigenschaft festzulegen .Dies kann erreicht werden, indem eine Kategorie in CALayer erstellt, der Schlüsselpfad auf eine eindeutige neue "Eigenschaft" (
borderColorFromUIColor
) gesetzt und in der Kategorie der entsprechende Setter (setBorderColorFromUIColor:
) überschrieben wird .quelle
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 tatsächlich die Funktion zu IB in Xcode hinzu! Einige der Screenshots in anderen Antworten lassen den Eindruck entstehen, dass die Felder in IB vorhanden sind, in Xcode 9 jedoch nicht. Aber wenn er seinem Beitrag folgt, werden sie hinzugefügt.
quelle
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 } } }
quelle
Das funktioniert bei mir.
Swift 3, Xcode 8.3
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) } }
}}
quelle