É possível controlar as propriedades da borda do UIView (cor, espessura, etc ...) diretamente do construtor de interface ou eu posso fazê-lo apenas programaticamente?
É possível controlar as propriedades da borda do UIView (cor, espessura, etc ...) diretamente do construtor de interface ou eu posso fazê-lo apenas programaticamente?
Respostas:
Na verdade, você pode definir algumas propriedades da camada de uma visualização por meio do construtor de interfaces. Eu sei que posso definir borderWidth e cornerRadius de uma camada através do xcode. borderColor não funciona, provavelmente porque a camada deseja um CGColor em vez de um UIColor.
Você pode ter que usar Strings em vez de números, mas funciona!
layer.cornerRadius
layer.borderWidth
layer.borderColor
Atualização: layer.masksToBounds = true
A resposta do Rich86Man está correta, mas você pode usar categorias para propriedades de proxy, como layer.borderColor. (Do ConvencionalC 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
O resultado será aparente durante o tempo de execução, não no Xcode.
Editar : você também precisa definir layer.borderWidth
pelo menos 1 para ver a borda com a cor escolhida.
No Swift 2.0:
extension CALayer {
var borderUIColor: UIColor {
set {
self.borderColor = newValue.CGColor
}
get {
return UIColor(CGColor: self.borderColor!)
}
}
}
No Swift 3.0:
extension CALayer {
var borderUIColor: UIColor {
set {
self.borderColor = newValue.cgColor
}
get {
return UIColor(cgColor: self.borderColor!)
}
}
}
Resposta semelhante à do iHulk, mas em Swift
Adicione um arquivo chamado UIView.swift ao seu projeto (ou cole-o em qualquer arquivo):
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
}
}
}
Em seguida, isso estará disponível no Interface Builder para cada botão, imageView, etiqueta etc. no Painel de utilitários> Inspetor de atributos:
Nota: a borda aparecerá apenas em tempo de execução.
@IBDesignable
do início da extensão.
Você pode criar uma categoria do UIView e adicioná-lo no arquivo .h da categoria
@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;
Agora adicione isso no arquivo .m
@dynamic borderColor,borderWidth,cornerRadius;
e isso também em. arquivo 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];
}
agora você verá isso no seu storyboard para todas as subclasses UIView (UILabel, UITextField, UIImageView etc.)
É isso. Não é necessário importar a categoria em qualquer lugar, basta adicionar os arquivos da categoria no projeto e ver essas propriedades no storyboard.
Para Swift 3 e 4 , se você estiver disposto a usar IBInspectable
s, existe o seguinte:
@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
}
}
}
Embora isso possa definir as propriedades, ele não reflete na IB. Portanto, se você está essencialmente escrevendo código no IB, pode fazê-lo no seu código-fonte
Se você quiser economizar tempo, use duas UIViews
em cima da outra, a da parte traseira sendo da cor da borda e a da frente menor, dando o efeito da borda. Também não acho que essa seja uma solução elegante, mas se a Apple se importava um pouco mais, não seria necessário fazer isso.
É absolutamente possível apenas quando você define layer.masksToBounds = true
e descansa as coisas.
O storyboard não funciona para mim o tempo todo, mesmo depois de tentar toda a solução aqui
Portanto, é sempre uma resposta perfeita usar o código, basta criar a instância IBOutlet do UIView e adicionar as propriedades
Resposta curta :
layer.cornerRadius = 10
layer.borderWidth = 1
layer.borderColor = UIColor.blue.cgColor
Resposta longa :
customUIView.layer.cornerRadius = 10
pcustomUIView.layer.borderWidth = 2
customUIView.layer.borderColor = UIColor.blue.cgColor
Adicione estas 2 linhas simples de código:
self.YourViewName.layer.cornerRadius = 15
self.YourViewName.layer.masksToBounds = true
Vai funcionar bem.