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?
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?
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
Mise à jour: layer.masksToBounds = true
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!)
}
}
}
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.
@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.
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
}
}
}
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
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.
Ce n'est absolument possible que lorsque vous définissez layer.masksToBounds = true
et que vous vous reposez.
Le storyboard ne fonctionne pas pour moi tout le temps même après avoir essayé toutes les solutions ici
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 :
customUIView.layer.cornerRadius = 10
pcustomUIView.layer.borderWidth = 2
customUIView.layer.borderColor = UIColor.blue.cgColor
Veuillez ajouter ces 2 lignes de code simples:
self.YourViewName.layer.cornerRadius = 15
self.YourViewName.layer.masksToBounds = true
Cela fonctionnera très bien.