0

我有一个带有子层(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]

4

1 回答 1

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;
}
于 2014-08-18T15:47:50.633 回答