È possibile controllare le proprietà dei bordi di UIView (colore, spessore, ecc ...) direttamente dal builder di interfacce o posso farlo solo a livello di programmazione?
È possibile controllare le proprietà dei bordi di UIView (colore, spessore, ecc ...) direttamente dal builder di interfacce o posso farlo solo a livello di programmazione?
Risposte:
In realtà è possibile impostare alcune proprietà del livello di una vista tramite il generatore di interfaccia. So che posso impostare borderWidth e cornerRadius di un layer tramite xcode. borderColor non funziona, probabilmente perché il layer vuole un CGColor anziché un UIColor.
Potrebbe essere necessario utilizzare le stringhe anziché i numeri, ma funziona!
layer.cornerRadius
layer.borderWidth
layer.borderColor
Aggiornamento: layer.masksToBounds = true
La risposta di Rich86Man è corretta, ma è possibile utilizzare le categorie per proxy proprietà come layer.borderColor. (Dal convenzionale 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
Il risultato sarà evidente durante il runtime, non in Xcode.
Modifica : devi anche impostare layer.borderWidth
almeno 1 per vedere il bordo con il colore scelto.
In Swift 2.0:
extension CALayer {
var borderUIColor: UIColor {
set {
self.borderColor = newValue.CGColor
}
get {
return UIColor(CGColor: self.borderColor!)
}
}
}
In Swift 3.0:
extension CALayer {
var borderUIColor: UIColor {
set {
self.borderColor = newValue.cgColor
}
get {
return UIColor(cgColor: self.borderColor!)
}
}
}
Risposta simile a quella di iHulk, ma in Swift
Aggiungi un file chiamato UIView.swift nel tuo progetto (o semplicemente incollalo in qualsiasi file):
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
}
}
}
Quindi questo sarà disponibile in Interface Builder per ogni pulsante, imageView, etichetta, ecc. Nel Pannello Utilità> Impostazioni attributi:
Nota: il bordo verrà visualizzato solo in fase di esecuzione.
@IBDesignable
dall'inizio dell'estensione.
Puoi creare una categoria di UIView e aggiungerla nel file .h della categoria
@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;
Ora aggiungi questo nel file .m
@dynamic borderColor,borderWidth,cornerRadius;
e anche questo in. file 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];
}
ora lo vedrai nello storyboard per tutte le sottoclassi di UIView (UILabel, UITextField, UIImageView ecc.)
Ecco fatto. Non è necessario importare la categoria ovunque, basta aggiungere i file della categoria nel progetto e vedere queste proprietà nello storyboard.
Per Swift 3 e 4 , se sei disposto a usare IBInspectable
s, c'è questo:
@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
}
}
}
mentre questo potrebbe impostare le proprietà, in realtà non si riflette in IB. Quindi, se essenzialmente stai scrivendo codice in IB, potresti anche farlo nel tuo codice sorgente
Se vuoi risparmiare tempo, basta usarne due uno UIViews
sopra l'altro, uno sul retro è il colore del bordo e uno davanti più piccolo, dando l'effetto del bordo. Non penso che questa sia una soluzione elegante, ma se Apple si preoccupasse un po 'di più, non dovresti farlo.
È assolutamente possibile solo quando si imposta layer.masksToBounds = true
e si riposa roba.
Lo storyboard non funziona sempre per me, anche dopo aver provato tutta la soluzione qui
Quindi è sempre la risposta perfetta sta usando il codice, basta creare l'istanza IBOutlet di UIView e aggiungere le proprietà
Risposta breve :
layer.cornerRadius = 10
layer.borderWidth = 1
layer.borderColor = UIColor.blue.cgColor
Risposta lunga :
customUIView.layer.cornerRadius = 10
pcustomUIView.layer.borderWidth = 2
customUIView.layer.borderColor = UIColor.blue.cgColor
Aggiungi queste 2 semplici righe di codice:
self.YourViewName.layer.cornerRadius = 15
self.YourViewName.layer.masksToBounds = true
Funzionerà benissimo.