Cocoa Touch: ¿Cómo cambiar el color y el grosor del borde de UIView?

Vi en el inspector que puedo cambiar el color de fondo, pero también me gustaría cambiar el grosor y el color del borde, ¿es posible?

Gracias

Debe usar la capa de vista para establecer la propiedad de borde. p.ej:

#import  ... view.layer.borderColor = [UIColor redColor].CGColor; view.layer.borderWidth = 3.0f; 

También necesita establecer un enlace con QuartzCore.framework para acceder a esta funcionalidad.

Actualización Xcode 6

Desde la última versión de Xcode hay una mejor solución para esto:

Con @IBInspectable puede establecer Atributos directamente desde el Attributes Inspector .

Mi vista personalizada @IBInspectable Atributos

Esto establece los User Defined Runtime Attributes el User Defined Runtime Attributes para usted:

enter image description here

Hay dos enfoques para configurar esto:

Opción 1 (con actualización en vivo en Storyboard)

  1. Crea MyCustomView .
  2. Esto hereda de UIView .
  3. Establezca @IBDesignable (esto hace que la actualización de la vista en vivo). *
  4. Establezca los Atributos de tiempo de ejecución (borde, etc.) con @IBInspectable
  5. Cambie su clase de vistas a MyCustomView
  6. Edite en el Panel de Atributos y vea los cambios en el Guión Gráfico 🙂

`

 @IBDesignable class MyCustomView: UIView { @IBInspectable var cornerRadius: CGFloat = 0 { didSet { layer.cornerRadius = cornerRadius layer.masksToBounds = cornerRadius > 0 } } @IBInspectable var borderWidth: CGFloat = 0 { didSet { layer.borderWidth = borderWidth } } @IBInspectable var borderColor: UIColor? { didSet { layer.borderColor = borderColor?.CGColor } } } 

* @IBDesignable solo funciona cuando se establece al inicio de la class MyCustomView

Opción 2 (no funciona desde Swift 1.2, ver comentarios)

Extiende tu clase UIView:

 extension UIView { @IBInspectable var cornerRadius: CGFloat = 0 { didSet { layer.cornerRadius = cornerRadius layer.masksToBounds = cornerRadius > 0 } } @IBInspectable var borderWidth: CGFloat = 0 { didSet { layer.borderWidth = borderWidth } } @IBInspectable var borderColor: UIColor? { didSet { layer.borderColor = borderColor?.CGColor } } } 

De esta manera, su vista predeterminada siempre tiene esos campos adicionales editables en Attributes Inspector . Otra ventaja es que no tiene que cambiar la clase a MycustomView todo el tiempo. Sin embargo, una desventaja de esto es que solo verá los cambios cuando ejecute su aplicación.

También puede crear un borde con el color de su deseo.

 view.layer.borderColor = [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1.0].CGColor; 

* r, g, b son los valores entre 0 y 255.

Agregue las siguientes @IBInspectables en la extensión UIView

 extension UIView { @IBInspectable var borderWidth: CGFloat { get { return layer.borderWidth } set(newValue) { layer.borderWidth = newValue } } @IBInspectable var borderColor: UIColor? { get { if let color = layer.borderColor { return UIColor(CGColor: color) } return nil } set(newValue) { layer.borderColor = newValue?.CGColor } } } 

Y luego debería poder establecer los atributos borderColor y borderWidth directamente desde el inspector de atributos. Ver imagen adjunta

Inspector de atributos

Cuando uso la solución CALayer de Vladimir, y en la parte superior de la vista tengo una animación, como un UINavigationController modal descartando, veo un montón de fallas sucediendo y teniendo problemas de rendimiento de dibujo.

Entonces, otra forma de lograr esto, pero sin las fallas técnicas y la pérdida de rendimiento, es hacer una UIView personalizada e implementar el mensaje drawRect manera:

 - (void)drawRect:(CGRect)rect { CGContextRef contextRef = UIGraphicsGetCurrentContext(); CGContextSetLineWidth(contextRef, 1); CGContextSetRGBStrokeColor(contextRef, 255.0, 255.0, 255.0, 1.0); CGContextStrokeRect(contextRef, rect); } 

Prueba este código:

 view.layer.borderColor = [UIColor redColor].CGColor; view.layer.borderWidth= 2.0; [view setClipsToBounds:YES]; 

No recomendaría anular el drawRect debido a causar un golpe de rendimiento.

En cambio, modificaría las propiedades de la clase como a continuación (en su vista personalizada):

  - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.layer.borderWidth = 2.f; self.layer.borderColor = [UIColor redColor].CGColor; } return self; 

No vi ningún error técnico al tomar el enfoque anterior, no estoy seguro de por qué poner el initWithFrame detiene esto 😉

 view.layer.borderWidth = 1.0 view.layer.borderColor = UIColor.lightGray.cgColor 

Quería agregar esto a la respuesta de @ marczking ( Opción 1 ) como comentario, pero mi humilde estado en StackOverflow impide eso.

Hice una respuesta de port of @ marczking al Objective C. Funciona como un encanto, gracias @marczking!

UIView + Border.h:

 #import  IB_DESIGNABLE @interface UIView (Border) -(void)setBorderColor:(UIColor *)color; -(void)setBorderWidth:(CGFloat)width; -(void)setCornerRadius:(CGFloat)radius; @end 

UIView + Border.m:

 #import "UIView+Border.h" @implementation UIView (Border) // Note: cannot use synthesize in a Category -(void)setBorderColor:(UIColor *)color { self.layer.borderColor = color.CGColor; } -(void)setBorderWidth:(CGFloat)width { self.layer.borderWidth = width; } -(void)setCornerRadius:(CGFloat)radius { self.layer.cornerRadius = radius; self.layer.masksToBounds = radius > 0; } @end 

Si no desea editar la capa de un UIView, siempre puede insertar la vista dentro de otra vista. La vista principal tendrá su color de fondo establecido en el color del borde. También sería un poco más grande, dependiendo de qué ancho desee que sea el borde.

Por supuesto, esto solo funciona si su vista no es transparente y solo desea un color de borde único. El OP quería el borde en la vista en sí, pero esta podría ser una alternativa viable.

@IBInspectable funciona para mí en iOS 9, Swift 2.0

 extension UIView { @IBInspectable var borderWidth: CGFloat { get { return layer.borderWidth } set(newValue) { layer.borderWidth = newValue } } @IBInspectable var cornerRadius: CGFloat { get { return layer.cornerRadius } set(newValue) { layer.cornerRadius = newValue } } @IBInspectable var borderColor: UIColor? { get { if let color = layer.borderColor { return UIColor(CGColor: color) } return nil } set(newValue) { layer.borderColor = newValue?.CGColor } } 

Si desea agregar diferentes bordes en diferentes lados, puede agregar una subvista con el estilo específico que es una manera fácil de encontrar.