在awakeFromNib中使用CALayer与drawRect的区别

3
我很困惑,为什么如果我将以下代码添加到awakeFromNibinitWithFrame:中,它可以正常工作,但如果我将其添加到drawRect:中或直接调用它,它就无法工作?
self.layer.cornerRadius = CGRectGetWidth(self.bounds) / 2.0f;
self.layer.shadowColor = [UIColor blackColor].CGColor;
self.layer.shadowRadius = 3;
self.layer.shadowOffset = CGSizeMake(0.0f, 0.0f);
self.layer.shadowOpacity = 0.75f;

对于通过程序创建的按钮,我应该在哪里添加此方法?按钮可能仅使用init创建,并且稍后通过约束更改大小。 规范:工作时,指按钮将被圆形化(如果纵横比为1:1,则为圆形),并带有投影阴影。不工作指按钮将保持方形。

你为什么要从 drawRect 中调用它?你重写那个方法是为了绘制而不是思考。 - trojanfoe
对于通过编程创建的按钮,我应该将这个方法添加到哪里?该按钮可能仅使用init创建,并且稍后通过约束更改大小。这就是为什么。而且,因为我不知道在哪里调用它 :) - Lord Zsolt
drawRect:方法在init...awakeFromNib方法之后被调用,直到窗口或视图的层已经创建。您需要再次更新它们。 - Anoop Vaidya
好的,但是这仍然没有回答我的问题,对于使用init + constraints创建的按钮,我应该把它放在哪里。 - Lord Zsolt
@LordZsolt:我相信我上句话已经提示了,不是吗?每当您绘制新内容时,您需要使用 [setNeedDisplay:YES]... - Anoop Vaidya
1个回答

1

请查看Apple文档中的详细说明,但基本上是因为您在绘制周期中设置了图层配置(cornerRadius、shadow等),而您应该在绘制周期开始之前完成这些配置。

从drawRect:文档中可以看到:

在调用此方法时,UIKit已经为您的视图正确配置了绘制环境,因此您可以简单地调用任何绘制方法和函数以呈现内容。

其他函数,例如awakeFromNib:initWithFrame:在绘制周期之前发生,这意味着您的配置将在它们被渲染在屏幕上之前考虑到。相比之下,drawRect:假设这些基本配置已经设置,并仅在屏幕上呈现您指定的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接