Ist es möglich, die Eigenschaften von UIView-Rändern (Farbe, Dicke usw.) direkt vom Interface Builder aus zu steuern, oder kann ich dies nur programmgesteuert tun?
Ist es möglich, die Eigenschaften von UIView-Rändern (Farbe, Dicke usw.) direkt vom Interface Builder aus zu steuern, oder kann ich dies nur programmgesteuert tun?
Antworten:
Tatsächlich können Sie einige Eigenschaften der Ebene einer Ansicht über den Interface Builder festlegen. Ich weiß, dass ich die Rahmenbreite und den Eckradius einer Ebene über xcode festlegen kann. borderColor funktioniert nicht, wahrscheinlich weil die Ebene eine CGColor anstelle einer UIColor möchte.
Möglicherweise müssen Sie Strings anstelle von Zahlen verwenden, aber es funktioniert!
layer.cornerRadius
layer.borderWidth
layer.borderColor
Update: layer.masksToBounds = true
Update: Wählen Sie den entsprechenden Typ für den Schlüsselpfad aus:
Die Antwort von Rich86Man ist korrekt, aber Sie können Kategorien verwenden, um Eigenschaften wie layer.borderColor zu vertreten. (Vom konventionellen C CocoaPod)
CALayer + XibConfiguration.h:
#import <QuartzCore/QuartzCore.h>
#import <UIKit/UIKit.h>
@interface CALayer(XibConfiguration)
// This assigns a CGColor to borderColor.
@property(nonatomic, assign) UIColor* borderUIColor;
@end
CALayer + XibConfiguration.m:
#import "CALayer+XibConfiguration.h"
@implementation CALayer(XibConfiguration)
-(void)setBorderUIColor:(UIColor*)color
{
self.borderColor = color.CGColor;
}
-(UIColor*)borderUIColor
{
return [UIColor colorWithCGColor:self.borderColor];
}
@end
layer.borderUIColor
Das Ergebnis wird zur Laufzeit angezeigt, nicht in Xcode.
Bearbeiten : Sie müssen außerdem layer.borderWidth
mindestens 1 festlegen , um den Rand mit der ausgewählten Farbe anzuzeigen.
In Swift 2.0:
extension CALayer {
var borderUIColor: UIColor {
set {
self.borderColor = newValue.CGColor
}
get {
return UIColor(CGColor: self.borderColor!)
}
}
}
In Swift 3.0:
extension CALayer {
var borderUIColor: UIColor {
set {
self.borderColor = newValue.cgColor
}
get {
return UIColor(cgColor: self.borderColor!)
}
}
}
Ähnliche Antwort zu iHulks, aber in Swift
Fügen Sie Ihrem Projekt eine Datei mit dem Namen UIView.swift hinzu (oder fügen Sie diese einfach in eine beliebige Datei ein):
import UIKit
@IBDesignable extension UIView {
@IBInspectable var borderColor: UIColor? {
set {
layer.borderColor = newValue?.cgColor
}
get {
guard let color = layer.borderColor else {
return nil
}
return UIColor(cgColor: color)
}
}
@IBInspectable var borderWidth: CGFloat {
set {
layer.borderWidth = newValue
}
get {
return layer.borderWidth
}
}
@IBInspectable var cornerRadius: CGFloat {
set {
layer.cornerRadius = newValue
clipsToBounds = newValue > 0
}
get {
return layer.cornerRadius
}
}
}
Dies ist dann im Interface Builder für jede Schaltfläche, Bildansicht, Beschriftung usw. im Dienstprogrammbedienfeld> Attributinspektor verfügbar:
Hinweis: Der Rahmen wird nur zur Laufzeit angezeigt.
@IBDesignable
vom Anfang der Erweiterung entfernte.
Sie können eine Kategorie von UIView erstellen und diese in die .h-Datei der Kategorie einfügen
@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;
Fügen Sie dies nun in die .m-Datei ein
@dynamic borderColor,borderWidth,cornerRadius;
und das auch in. m Datei
-(void)setBorderColor:(UIColor *)borderColor{
[self.layer setBorderColor:borderColor.CGColor];
}
-(void)setBorderWidth:(CGFloat)borderWidth{
[self.layer setBorderWidth:borderWidth];
}
-(void)setCornerRadius:(CGFloat)cornerRadius{
[self.layer setCornerRadius:cornerRadius];
}
Jetzt sehen Sie dies in Ihrem Storyboard für alle UIView-Unterklassen (UILabel, UITextField, UIImageView usw.)
Das ist es .. Keine Notwendigkeit, eine Kategorie irgendwo zu importieren, fügen Sie einfach die Dateien der Kategorie im Projekt hinzu und sehen Sie diese Eigenschaften im Storyboard.
Für Swift 3 und 4 gibt es Folgendes, wenn Sie bereit sind, IBInspectable
s zu verwenden :
@IBDesignable extension UIView {
@IBInspectable var borderColor:UIColor? {
set {
layer.borderColor = newValue!.cgColor
}
get {
if let color = layer.borderColor {
return UIColor(cgColor: color)
}
else {
return nil
}
}
}
@IBInspectable var borderWidth:CGFloat {
set {
layer.borderWidth = newValue
}
get {
return layer.borderWidth
}
}
@IBInspectable var cornerRadius:CGFloat {
set {
layer.cornerRadius = newValue
clipsToBounds = newValue > 0
}
get {
return layer.cornerRadius
}
}
}
Dies kann zwar die Eigenschaften festlegen, spiegelt sich jedoch nicht in IB wider. Wenn Sie also im Wesentlichen Code in IB schreiben, können Sie dies auch in Ihrem Quellcode tun
Wenn Sie Zeit sparen möchten, verwenden Sie einfach zwei UIViews
übereinander, wobei die hintere die Rahmenfarbe und die vordere kleinere Farbe ist, um den Randeffekt zu erzielen. Ich denke auch nicht, dass dies eine elegante Lösung ist, aber wenn Apple sich ein bisschen mehr darum kümmert, sollten Sie dies nicht tun müssen.
Es ist absolut nur möglich, wenn Sie layer.masksToBounds = true
Sachen einstellen und ausruhen.
Das Storyboard funktioniert bei mir nicht immer, selbst nachdem ich die gesamte Lösung hier ausprobiert habe
Es ist also immer die perfekte Antwort, den Code zu verwenden. Erstellen Sie einfach eine IBOutlet-Instanz der UIView und fügen Sie die Eigenschaften hinzu
Kurze Antwort :
layer.cornerRadius = 10
layer.borderWidth = 1
layer.borderColor = UIColor.blue.cgColor
Lange Antwort :
customUIView.layer.cornerRadius = 10
pcustomUIView.layer.borderWidth = 2
customUIView.layer.borderColor = UIColor.blue.cgColor
Bitte fügen Sie diese 2 einfachen Codezeilen hinzu:
self.YourViewName.layer.cornerRadius = 15
self.YourViewName.layer.masksToBounds = true
Es wird gut funktionieren.