Configuré CornerRadius y BorderWidth para UIbutton en Atributos de tiempo de ejecución definidos por el usuario. Sin agregar layer.borderColor funciona bien y muestra el borde en color negro. Pero cuando agregar layer.borderColor no funciona (no muestra el borde).
ios
colors
uibutton
storyboard
Mohamed Jaleel Nazir
fuente
fuente
Tengo respuesta. Cambie borderColor en lugar de layer.borderColor :
y agregue este código en el archivo .m:
#import <QuartzCore/QuartzCore.h> @implementation CALayer (Additions) - (void)setBorderColorFromUIColor:(UIColor *)color { self.borderColor = color.CGColor; } @end
Marque las propiedades en Attribute Inspector
fuente
Swift 4, Xcode 9.2 : use
IBDesignable
yIBInspectable
para crear controles personalizados y obtener una vista previa en vivo del diseño en Interface Builder.Aquí hay un código de muestra en Swift, ubicado justo debajo
UIKit
de 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) } } }
Si va a Atributos inspeccionables de la vista, debería encontrar estas propiedades visualmente, edite las propiedades:
Los cambios también se reflejan en los atributos de tiempo de ejecución definidos por el usuario:
¡Corre en tiempo de construcción y listo! Verá su botón redondeado claro con borde.
fuente
La explicación, tal vez se pierda en algunas de las otras respuestas aquí:
La razón por la que no se establece esta propiedad es que
layer.borderColor
necesita un valor con tipoCGColor
.¡Pero solo los
UIColor
tipos se pueden configurar a través de los atributos de tiempo de ejecución definidos por el usuario de Interface Builder!Por lo tanto, debe establecer un UIColor en una propiedad de proxy a través de Interface Builder, luego interceptar esa llamada para establecer el CGColor equivalente a la
layer.borderColor
propiedad.Esto se puede lograr creando una Categoría en CALayer, estableciendo la Ruta de la Clave en una nueva "propiedad" única (
borderColorFromUIColor
), y en la categoría anulando el correspondiente setter (setBorderColorFromUIColor:
).fuente
¡Hay una manera mucho mejor de hacer esto! Deberías usar @IBInspectable. Consulte la entrada del blog de Mike Woelmer aquí: https://spin.atomicobject.com/2017/07/18/swift-interface-builder/
¡De hecho, agrega la función a IB en Xcode! Algunas de las capturas de pantalla en otras respuestas hacen que parezca que los campos existen en IB, pero al menos en Xcode 9 no. Pero siguiendo su publicación los agregaré.
fuente
En el caso de Swift, la función no funciona. Necesitará una propiedad calculada para lograr el resultado deseado:
extension CALayer { var borderColorFromUIColor: UIColor { get { return UIColor(CGColor: self.borderColor!) } set { self.borderColor = newValue.CGColor } } }
fuente
Esto funciona para mi.
Swift 3, Xcode 8.3
Extensión 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) } }
}
fuente