使用自定义绘图架:方法创建圆形UIBUTTON



我的目标是创建一个自定义的UIButton子类,该子类创建一个带有一些其他功能的圆形(或圆形rect)按钮。

搜索后,我发现只需设置按钮层的cornerRadius是使按钮回合的最简单方法:

@implementation myroundbutton

-(id)initWithFrame:(CGRect)frame{
    if (self = [super initWithFrame:frame])
        [self setupView];
    return self;
}
-(id)initWithCoder:(NSCoder *)aDecoder{
    if(self = [super initWithCoder:aDecoder])
        [self setupView];
    return self;
}
-(void)setupView {    
    self.layer.cornerRadius = MIN(self.frame.size.height, self.frame.size.width) / 2.0;
}

只要我不覆盖 drawRect:

,这对此有效
- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];
}

当然,我想将一些自定义的图形代码添加到drawRect:中,但是即使只有[super drawRect:rect],按钮不再圆形:它在其边界内绘制为矩形。

如何做到这一点?如何完全可以使用简单的超级呼叫来覆盖方法完全改变行为?

如何避免此问题?我已经尝试让图层不变,并简单地在drawRect:中手动绘制背景。但是,该按钮无论如何都会绘制其背景rect,我的自定义绘图在其顶部。

那么,如何解决这个问题?

示例中的图层从概念上包含一个带有角半径的背景,但是drawRect:的空覆盖导致被忽略的原因。这是因为通常,UIView的实例取决于其内置层(CALayer的实例)来渲染其内容,因此drawRect:未调用。但是,该层能够将图形行为委派给其视图,如果您实现drawRect:

如果您只是简单地划分UIView,这不应该出现任何问题。但是,将诸如UIButton之类的框架组件进行亚群有点含糊。一个潜在的问题是呼叫-[super drawRect:];很难确切地知道可能导致什么恶作剧,但这可能是问题的根源。默认情况下,UIButton不需要执行任何自定义图形;它包含一个私有类UIButtonLabel的嵌套实例,该实例绘制按钮的标题。

而不是试图覆盖内部细节是私有的类的绘图行为,而是考虑使用一个或多个静态图像,而只是为一个或多个状态设置按钮的背景图像属性。

查看是否更改了任何内容...

-(void)setupView {    
    self.layer.cornerRadius = MIN(self.frame.size.height, self.frame.size.width) / 2.0;
    self.clipsToBounds = YES;
}

最新更新