Подслой рисует только при создании в 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;
}
Другие вопросы по тегам