Подслой рисует только при создании в initWithFrame, а не initWithCoder
У меня есть пользовательский вид с подслоем (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]
1 ответ
Разница между initWithFrame:
а также initWithCoder:
в том, что 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;
}