【问题标题】:CALayer in awakeFromNib vs drawRectawakeFromNib 与 drawRect 中的 CALayer
【发布时间】:2015-05-15 12:15:49
【问题描述】:

我很困惑,为什么下面的代码我加到awakeFromNib或者initWithFrame:可以工作,但是我加到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 调用它?您覆盖该方法以绘制而不是思考。
  • For programatically created buttons, where should I add this method to? The button might be created with just init and size changed later via constraints. - 这就是原因。而且,因为我不知道还能在哪里称呼它:)
  • drawRect:init...awakeFromNib 之后调用,直到您的窗口或视图的图层已经创建。您再次需要更新它们。
  • 好的,但这仍然不能回答我应该将它放在哪里用于使用 init + 约束创建的按钮的问题。
  • @LordZsolt:我相信我的最后一句话给出了提示,不是吗。每当你画新东西时,你需要[setNeedDisplay:YES]...

标签: ios objective-c uibutton calayer


【解决方案1】:

查看the Apple Docs 中的详细描述,但本质上这是因为您在绘制周期的中间设置图层配置(cornerRadius、阴影等),而您应该在绘制周期开始之前完成此设置.

来自 drawRect: 文档:

当这个方法被调用时,UIKit 已经为你的视图配置了合适的绘图环境,你可以简单地调用任何你需要的绘图方法和函数来渲染你的内容。

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

【讨论】:

    猜你喜欢
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    相关资源
    最近更新 更多