El color del borde de UIView en el generador de interfaces no funciona?

Estoy intentando configurar las properties de la capa de una vista a través de IB. Todo funciona a exception del color del borde (property layer.borderColor ):

introduzca la descripción de la imagen aquí

Recuerdo que encontré este problema hace un año y terminé haciéndolo de manera programática. Y aún así, puedo hacer esto mediante progtwigción, pero tengo curiosidad por qué la propiedad layer.borderColor nunca funciona a través del generador de interfaces. No quiero importar QuartzCore , y luego escribir una línea extra de código solo por esto, parece una exageración.

Es posible hacer esto, pero no es una function incorporada. Esto se debe a que el tipo de Color en el panel Atributos de time de ejecución definido por el usuario crea un UIColor , pero layer.borderColor contiene un tipo CGColorRef . Lamentablemente, no hay forma de asignar un tipo CGColorRef en Interface Builder.

Sin embargo, esto es posible a través de una propiedad proxy. Vea la respuesta de Peter DeWeese a una pregunta diferente para una posible solución a este problema. Su respuesta define una categoría que permite establecer un color de proxy a través de Interface Builder.

Tienes que crear la Categoría para CALayer:

CALayer + UIColor.h

 #import <QuartzCore/QuartzCore.h> #import <UIKit/UIKit.h> @interface CALayer(UIColor) // This assigns a CGColor to borderColor. @property(nonatomic, assign) UIColor* borderUIColor; @end 

CALayer + UIColor.m

 #import "CALayer+UIColor.h" @implementation CALayer(UIColor) - (void)setBorderUIColor:(UIColor*)color { self.borderColor = color.CGColor; } - (UIColor*)borderUIColor { return [UIColor colorWithCGColor:self.borderColor]; } @end 

Y luego, en los attributes Runtime definidos por el usuario, puede usarlo tal como está en la image a continuación:

introduzca la descripción de la imagen aquí

Para Swift es mucho más simple:

 @IBInspectable var borderColor: UIColor? { didSet { layer.borderColor = borderColor?.CGColor layer.borderWidth = 1 } } 

Luego en Xcode puedes usarlo así:

introduzca la descripción de la imagen aquí

Una vez que elige sth, se agrega automáticamente a sus attributes de time de ejecución :

Mis dos centavos para portar la respuesta de Bartłomiej Semańczyk a Swift:

Cree una extensión para CALayer en su controller de vista:

 import UIKit extension CALayer { func borderUIColor() -> UIColor? { return borderColor != nil ? UIColor(CGColor: borderColor!) : nil } func setBorderUIColor(color: UIColor) { borderColor = color.CGColor } } 

Corta y pega esta class:

 import UIKit @IBDesignable class CustomView : UIView { @IBInspectable var borderColor: UIColor = UIColor.clearColor() { didSet { layer.borderColor = borderColor.CGColor } } @IBInspectable var borderWidth: CGFloat = 0 { didSet { layer.borderWidth = borderWidth } } @IBInspectable var cornerRadius: CGFloat = 0 { didSet { layer.cornerRadius = cornerRadius } } } 

Ahora, en Interface Builder, vaya al inspector de identidad y configure su vista como una class CustomView.

Ahora finalice su inspector de attributes: introduzca la descripción de la imagen aquí

Ya no es necesario perder el time con los attributes de time de ejecución definidos por el usuario. ¡Y sus cambios también aparecerán en el canvas!

Aquí hay una forma rápida de superar esto. Categorías …

 @interface UIView (IBAppearance) @property (nonatomic, strong) UIColor *borderColor; @end 

No tiene que savelo, es simplemente agradable para que pueda consultar más tarde. Lo importante es tomar el valor y asignar CGColor de UIColor a la capa.

 #import <objc/runtime.h> #define BORDER_COLOR_KEYPATH @"borderColor" @implementation UIView (IBAppearance) - (void)setBorderColor:(UIColor *)borderColor { UIColor *bc = objc_getAssociatedObject(self, BORDER_COLOR_KEYPATH); if(bc == borderColor) return; else { objc_setAssociatedObject(self, BORDER_COLOR_KEYPATH, borderColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC); self.layer.borderColor = [borderColor CGColor]; } } - (UIColor *)borderColor { return objc_getAssociatedObject(self, BORDER_COLOR_KEYPATH); } @end 

Por supuesto, en el Interface Builder no está configurando el valor en layer.borderColor , sino simplemente en borderColor .

Use IBDesignable en lugar de Atributos Runtime, es más claro.

Coloque este código en cualquier class y edite las properties directamente en el guión gráfico.

 import UIKit @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 } } } 

En Swift, puede ampliar la class UIButton y agregar un @IBInspectable que le permitirá seleccionar un color de storyboard y establecer su color (con un ancho de 1 que se puede cambiar). Agregue esto al final de su controller de vista:

 extension UIButton{ @IBInspectable var borderColor: UIColor? { get { return UIColor(CGColor: layer.borderColor!) } set { layer.borderColor = newValue?.CGColor layer.borderWidth = 1 } } } 

Para cumplir con CALayer KVC para la propiedad borderColorFromUIColor, simplemente implementa el

 layer.borderColorFromUIColor=[UIColor networking]; 

Este enlace tiene awnser

Encontré el mismo problema, trabajé alnetworkingedor creando una class de button personalizado:

 class UIButtonWithRoundBorder: UIButton { requinetworking init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.layer.cornerRadius = 6 self.layer.borderWidth = 1 self.layer.borderColor = UIColor.whiteColor().CGColor self.clipsToBounds = true } } 

Luego en IB, cambie el tipo de "UIButton" a "UIButtonWithRoundBorder".

Simple y práctico también. 🙂

Creo que puede ser porque tienes máscarasToBounds en SÍ. No creo que el borde se dibuje dentro de los límites de la capa, por lo que no se dibujará ya que está ocultando todo fuera de sus límites.

borderColor no funcionará A MENOS borderWidth propiedad borderWidth de la capa esté configurada en un valor mayor que 0 .

Swift 3:

 button.layer.borderColor = UIColor.white.cgColor button.layer.borderWidth = 1.0 // Default value is 0, that's why omitting this line will not make the border color show. 

Puede establecer un valor para la tecla "borderColor" en el XIB y usar:

 extension UIView { open override func setValue(_ value: Any?, forKey key: String) { guard key == "borderColor", let color = value as? UIColor else { super.setValue(value, forKey: key) return } layer.borderColor = color.cgColor } }