我的目标是创建一个自定义的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;
}