¿Es posible controlar las propiedades del borde UIView (color, grosor, etc.) directamente desde el generador de interfaces o solo puedo hacerlo mediante programación?
¿Es posible controlar las propiedades del borde UIView (color, grosor, etc.) directamente desde el generador de interfaces o solo puedo hacerlo mediante programación?
Respuestas:
En realidad, puede establecer algunas propiedades de la capa de una vista a través del generador de interfaces. Sé que puedo establecer borderWidth y cornerRadius de una capa a través de xcode. borderColor no funciona, probablemente porque la capa quiere un CGColor en lugar de un UIColor.
Puede que tenga que usar cadenas en lugar de números, ¡pero funciona!
layer.cornerRadius
layer.borderWidth
layer.borderColor
Actualización: layer.masksToBounds = true
La respuesta de Rich86Man es correcta, pero puede usar categorías para propiedades proxy como layer.borderColor. (Del convencional C cacao C)
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
El resultado será evidente durante el tiempo de ejecución, no en Xcode.
Editar : también debe establecer layer.borderWidth
al menos 1 para ver el borde con el color elegido.
En Swift 2.0:
extension CALayer {
var borderUIColor: UIColor {
set {
self.borderColor = newValue.CGColor
}
get {
return UIColor(CGColor: self.borderColor!)
}
}
}
En Swift 3.0:
extension CALayer {
var borderUIColor: UIColor {
set {
self.borderColor = newValue.cgColor
}
get {
return UIColor(cgColor: self.borderColor!)
}
}
}
Respuesta similar a la de iHulk, pero en Swift
Agregue un archivo llamado UIView.swift en su proyecto (o simplemente péguelo en cualquier archivo):
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
}
}
}
Entonces esto estará disponible en Interface Builder para cada botón, imageView, etiqueta, etc. en el Panel de utilidades> Inspector de atributos:
Nota: el borde solo aparecerá en tiempo de ejecución.
@IBDesignable
desde el comienzo de la extensión.
Puede crear una categoría de UIView y agregar esto en el archivo .h de categoría
@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;
Ahora agregue esto en el archivo .m
@dynamic borderColor,borderWidth,cornerRadius;
y esto también en. archivo m
-(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];
}
ahora verá esto en su guión gráfico para todas las subclases de UIView (UILabel, UITextField, UIImageView, etc.)
Eso es ... No es necesario importar la categoría en ningún lugar, solo agregue los archivos de la categoría en el proyecto y vea estas propiedades en el guión gráfico.
Para Swift 3 y 4 , si está dispuesto a usar IBInspectable
s, hay esto:
@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
}
}
}
Si bien esto podría establecer las propiedades, en realidad no se refleja en IB. Entonces, si esencialmente está escribiendo código en IB, también podría hacerlo en su código fuente
Si desea ahorrar tiempo, simplemente use dos UIViews
uno encima del otro, el de la parte posterior es el color del borde y el del frente es más pequeño, lo que da el efecto de borde. Tampoco creo que esta sea una solución elegante, pero si a Apple le importa un poco más, entonces no debería tener que hacer esto.
Es absolutamente posible solo cuando configuras layer.masksToBounds = true
y descansas cosas.
Storyboard no funciona para mí todo el tiempo, incluso después de probar toda la solución aquí
Por lo tanto, siempre es la respuesta perfecta es usar el código, solo cree la instancia IBOutlet de UIView y agregue las propiedades
Respuesta corta :
layer.cornerRadius = 10
layer.borderWidth = 1
layer.borderColor = UIColor.blue.cgColor
Respuesta larga :
customUIView.layer.cornerRadius = 10
pcustomUIView.layer.borderWidth = 2
customUIView.layer.borderColor = UIColor.blue.cgColor
Agregue estas 2 líneas de código simples:
self.YourViewName.layer.cornerRadius = 15
self.YourViewName.layer.masksToBounds = true
Funcionará bien