我有一个带有子图层(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]
答案 0 :(得分:1)
initWithFrame:
和initWithCoder:
之间的区别在于,当从storyboard / nib创建视图时,会调用initWithCoder:
。
如果以编程方式添加它,例如:
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;
}