【问题标题】:How do I use a CALayer to custom draw in a UIButton如何使用 CALayer 在 UIButton 中自定义绘制
【发布时间】:2012-06-05 20:12:20
【问题描述】:

我正在尝试使用 Quartz 绘制一个精美的 UIButton。我已经像这样声明了自己的按钮类:

@interface MyButton : UIButton
@end

在 .m 文件中,我正在构建按钮:

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        // Initialization code
        CALayer *buttonLayer = self.layer;
        buttonLayer.masksToBounds = YES;

        CALayer *customDrawn = [CALayer layer];
        customDrawn.delegate = self;
        customDrawn.masksToBounds = YES;
        [buttonLayer insertSublayer:customDrawn atIndex:0];
        [customDrawn setNeedsDisplay];
    }
    return self;
}

但这会导致某种递归,最终以EXC_BAD_ACCESS 失败。

我已经实现了一个方法drawLayer: inContext:,但它仍然崩溃。我可以避免崩溃的唯一方法是删除委托分配,但是我无法执行任何我想要实现的自定义绘图。

我怎样才能做到这一点?

【问题讨论】:

标签: objective-c ios5 uibutton core-graphics


【解决方案1】:

正如 Kurt Revis 提到的问题中所述,UIView(例如 UIButton)不能用作子层的委托。 (它已经是 UIView 的“主”层的委托,不能用作另一层的委托。)解决方案是使用另一个对象作为委托,该对象可以是刚刚用于的“私有”类实现drawLayer: inContext: 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多