Je sais que cette question a longtemps, mais récemment, j'étais dans une situation similaire, j'ai donc décidé de mettre ma réponse pour ceux qui sont dans une situation comme celle-ci.
Je voulais être en mesure de régler la borderColor
et shadowColor
sur une UIView
par l'Interface Builder, mais le type de borderColor
propriété d'une couche est CGColor
(comme shadowColor
) qui ne fait pas partie des types autorisés à modifier en la caractéristique des attributs d'exécution définie par l'utilisateur.
donc je l'ai fait une extension pour CALayer
et j'ai ajouté deux propriétés appelées borderColorIB et shadowColorIB qui sont de type UIColor:
RuntimeAttributes.h
@import QuartzCore;
@interface CALayer (IBConfiguration)
@property(nonatomic, assign) UIColor* borderColorIB;
@property(nonatomic, assign) UIColor* shadowColorIB;
@end
RuntimeAttributes.m
#import <UIKit/UIKit.h>
#import "RuntimeAttributes.h"
@implementation CALayer (IBConfiguration)
-(void)setBorderColorIB:(UIColor*)color
{
self.borderColor = color.CGColor;
}
-(UIColor*)borderColorIB
{
return [UIColor colorWithCGColor:self.borderColor];
}
-(void)setShadowColorIB:(UIColor*)color
{
self.shadowColor = color.CGColor;
}
-(UIColor*)shadowColorIB
{
return [UIColor colorWithCGColor:self.shadowColor];
}
@end
Maintenant, je serai alredy en mesure de définir ces deux propriétés par Interface Builder comme ceci:
- Dans la section 'Attributs d'exécution définis par l'utilisateur' (inspecteur Identity)
Assurez-vous le UIView est sélectionné et ajouter les attributs d'exécution suivants:
- layer.borderWidth, Nombre, 1
- layer.borderColorIB, couleur, someColor
<- my custom property to set the borderColor
- layer.shadowColorIB, couleur, someColor
<- my custom property to set the shadowColor
- layer.shadowOpacity, Nombre, 0,8
- layer.shadowOffset, la taille, {5,5}
couche
- . cornerRadius, Nombre, 5
Voici une image pour vous montrer comment je l'ai fait:
... et le résultat sera évident lors de l'exécution, pas dans Xcode:
J'espère que cela peut aider certaines personnes là-bas!
tout à fait au hasard, je viens de découvrir le problème réel ne semble pas être InterfaceBuilder, mais le fait que je mets les clipsToBounds de ma vue InterfaceBuilder = OUI. N'ayant pas ici est correct. Donc je suppose que je vais devoir envelopper la vue dans une seconde vue avec clipsToBound = NO et l'ombre. Y a-t-il un autre moyen? – Dennis
J'ai eu le même problème, mais c'était parce que "Clip Subviews" a été vérifié pour la vue dans Interface Builder. Décochez cette case pour rendre l'ombre CALayer visible. – azdev