Est-il possible de contrôler les propriétés des bordures UIView (couleur, épaisseur, etc.) directement à partir du constructeur d'interface ou je ne peux le faire que par programme?
ios
uiview
interface-builder
border
matteo.cajani
la source
la source
Réponses:
En fait, vous pouvez définir certaines propriétés de la couche d'une vue via le générateur d'interface. Je sais que je peux définir borderWidth et cornerRadius d'un calque via xcode. borderColor ne fonctionne pas, probablement parce que le calque veut un CGColor au lieu d'un UIColor.
Vous devrez peut-être utiliser des chaînes au lieu de nombres, mais cela fonctionne!
layer.cornerRadius layer.borderWidth layer.borderColor
la source
La réponse de Rich86Man est correcte, mais vous pouvez utiliser des catégories pour proxy des propriétés telles que layer.borderColor. (À partir du CocoaPod conventionnel )
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
Le résultat sera apparent pendant l'exécution, pas dans Xcode.
Modifier : vous devez également définir
layer.borderWidth
au moins 1 pour voir la bordure avec la couleur choisie.Dans Swift 2.0:
extension CALayer { var borderUIColor: UIColor { set { self.borderColor = newValue.CGColor } get { return UIColor(CGColor: self.borderColor!) } } }
Dans Swift 3.0:
extension CALayer { var borderUIColor: UIColor { set { self.borderColor = newValue.cgColor } get { return UIColor(cgColor: self.borderColor!) } } }
la source
Réponse similaire à celle d'iHulk, mais dans Swift
Ajoutez un fichier nommé UIView.swift dans votre projet (ou collez-le simplement dans n'importe quel fichier):
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 } } }
Ensuite, cela sera disponible dans Interface Builder pour chaque bouton, imageView, étiquette, etc. dans le panneau Utilitaires> Inspecteur d'attributs:
Remarque: la bordure n'apparaîtra qu'au moment de l'exécution.
la source
@IBDesignable
depuis le début de l'extension.Vous pouvez créer une catégorie d'UIView et l'ajouter dans le fichier .h de la catégorie
@property (nonatomic) IBInspectable UIColor *borderColor; @property (nonatomic) IBInspectable CGFloat borderWidth; @property (nonatomic) IBInspectable CGFloat cornerRadius;
Maintenant, ajoutez ceci dans le fichier .m
@dynamic borderColor,borderWidth,cornerRadius;
et cela aussi dans. m fichier
-(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]; }
maintenant, vous le verrez dans votre storyboard pour toutes les sous-classes UIView (UILabel, UITextField, UIImageView, etc.)
C'est tout .. Pas besoin d'importer la catégorie n'importe où, ajoutez simplement les fichiers de la catégorie dans le projet et voyez ces propriétés dans le storyboard.
la source
Pour Swift 3 et 4 , si vous êtes prêt à utiliser
IBInspectable
s, il y a ceci:@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 } } }
la source
bien que cela puisse définir les propriétés, il ne se reflète pas réellement dans IB. Donc, si vous écrivez essentiellement du code dans IB, vous pouvez aussi bien le faire dans votre code source
la source
Si vous voulez gagner du temps, il suffit d'en utiliser deux l'un
UIViews
sur l'autre, celui à l'arrière étant la couleur de la bordure et celui à l'avant plus petit, donnant l'effet de bordure. Je ne pense pas non plus que ce soit une solution élégante, mais si Apple se souciait un peu plus, vous ne devriez pas avoir à le faire.la source
Ce n'est absolument possible que lorsque vous définissez
layer.masksToBounds = true
et que vous vous reposez.la source
La réponse est donc toujours parfaite en utilisant le code, créez simplement une instance IBOutlet de l'UIView et ajoutez les propriétés
Réponse courte :
layer.cornerRadius = 10 layer.borderWidth = 1 layer.borderColor = UIColor.blue.cgColor
Longue réponse :
Coins arrondis de UIView / UIButton etc.
customUIView.layer.cornerRadius = 10
Épaisseur de la bordure
pcustomUIView.layer.borderWidth = 2
Couleur de la bordure
customUIView.layer.borderColor = UIColor.blue.cgColor
la source
Veuillez ajouter ces 2 lignes de code simples:
self.YourViewName.layer.cornerRadius = 15 self.YourViewName.layer.masksToBounds = true
Cela fonctionnera très bien.
la source