Ustawiłem CornerRadius i BorderWidth dla UIbutton w atrybutach wykonawczych zdefiniowanych przez użytkownika. Bez dodawania layer.borderColor działa dobrze i wyświetla obramowanie w kolorze czarnym. Ale po dodaniu warstwy.borderColor nie działa (nie wyświetla obramowania).
ios
colors
uibutton
storyboard
Mohamed Jaleel Nazir
źródło
źródło
Dostałem odpowiedź. Zmień borderColor zamiast layer.borderColor :
i dodaj ten kod w pliku .m:
#import <QuartzCore/QuartzCore.h> @implementation CALayer (Additions) - (void)setBorderColorFromUIColor:(UIColor *)color { self.borderColor = color.CGColor; } @end
Zaznacz właściwości w Inspektorze atrybutów
źródło
Swift 4, Xcode 9.2 - Użyj
IBDesignable
iIBInspectable
do tworzenia niestandardowych formantów i podglądu projektu na żywo w programie Interface Builder.Oto przykładowy kod w Swift, umieszczony tuż pod
UIKit
plikiem w 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) } } }
Jeśli przejdziesz do atrybutów widoku, które można przeglądać, powinieneś wizualnie znaleźć te właściwości, edytuj właściwości:
Zmiany są również odzwierciedlane w atrybutach czasu wykonywania zdefiniowanych przez użytkownika:
Uruchom w czasie kompilacji i Voila! zobaczysz swój wyraźny zaokrąglony przycisk z obramowaniem.
źródło
Wyjaśnienie, być może zagubione w niektórych innych odpowiedziach tutaj:
Powodem, dla którego ta właściwość nie jest ustawiana, jest konieczność
layer.borderColor
podania wartości typuCGColor
.Ale tylko
UIColor
typy można ustawić za pomocą zdefiniowanych przez użytkownika atrybutów wykonawczych programu Interface Builder!Dlatego należy ustawić UIColor na właściwość proxy za pośrednictwem Interface Builder, a następnie przechwycić to wywołanie, aby ustawić równoważny CGColor na
layer.borderColor
właściwość.Można to osiągnąć, tworząc kategorię na CALayer, ustawiając ścieżkę klucza na unikatową nową „właściwość” (
borderColorFromUIColor
) oraz w kategorii nadpisując odpowiednią metodę ustawiającą (setBorderColorFromUIColor:
).źródło
Jest na to znacznie lepszy sposób! Powinieneś użyć @IBInspectable. Sprawdź wpis na blogu Mike'a Woelmera tutaj: https://spin.atomicobject.com/2017/07/18/swift-interface-builder/
W rzeczywistości dodaje tę funkcję do IB w Xcode! Niektóre zrzuty ekranu w innych odpowiedziach sprawiają, że wygląda na to, że pola istnieją w IB, ale przynajmniej w Xcode 9 ich nie ma. Ale śledzenie jego postu spowoduje ich dodanie.
źródło
W przypadku Swifta funkcja nie działa. Aby osiągnąć pożądany rezultat, potrzebujesz obliczonej właściwości:
extension CALayer { var borderColorFromUIColor: UIColor { get { return UIColor(CGColor: self.borderColor!) } set { self.borderColor = newValue.CGColor } } }
źródło
To działa dla mnie.
Swift 3, Xcode 8.3
Rozszerzenie 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) } }
}
źródło