我有一个自定义视图与子层(CAShapeLayer)和子视图(UILabel)。当我在initWithCoder
中创建图层并设置背景色时,它总是显示为黑色。但是,如果我将代码移动到initWithFrame
,则颜色成功显示。
我们不应该在initWithCoder
中创建子层吗?
这是我能让我的代码工作的唯一方法:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.colorLayer = [CAShapeLayer layer];
self.colorLayer.opacity = 1.0;
[self.layer addSublayer:self.colorLayer];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) {
self.textLabel = [[UILabel alloc] initWithFrame:self.bounds];
self.textLabel.font = [UIFont primaryBoldFontWithSize:12];
self.textLabel.textColor = [UIColor whiteColor];
self.textLabel.textAlignment = NSTextAlignmentCenter;
self.textLabel.backgroundColor = [UIColor clearColor];
[self addSubview:self.textLabel];
}
return self;
}
- (void)drawRect:(CGRect)rect {
//Custom drawing of sublayer
}
:
原来在我的drawRect
我设置填充颜色错误。我应该用colorLayer.fillColor = myColor.CGColor
而不是[myColor setFill]
然后用[path fill]
initWithFrame:
和initWithCoder:
的区别在于initWithCoder:
是在从storyboard/nib创建视图时调用的。
如果以编程方式添加,例如:
UIView *v = [[UIView alloc] initWithFrame:...];
[self.view addSubview:v];
initWithFrame:
被调用。
一个好主意是创建基本的init方法,并在init中调用它。通过这种方式,当以编程方式或在故事板中添加视图时,初始化设置了两种场景中的所有属性。
例如:-(void)baseInit {
self.colorLayer = [CAShapeLayer layer];
self.colorLayer.opacity = 1.0;
//... other initialisation
}
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self baseInit];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) {
[self baseInit];
}
return self;
}