子层只在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]

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;
}

相关内容

  • 没有找到相关文章

最新更新