【发布时间】:2017-03-15 15:41:32
【问题描述】:
我的目标是创建一个自定义的UIButton 子类,它创建一个带有一些附加功能的圆形(或圆形矩形)按钮。
经过一番搜索,我发现简单地设置按钮层的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: 中简单地手动绘制背景。但是无论如何,按钮都会绘制它的背景矩形,而我的自定义绘图就在它上面。
那么,如何解决这个问题?
【问题讨论】:
-
“如何通过简单的超级调用覆盖方法来改变行为” UIButton 可能会检查覆盖并表现不同。它根本不需要用drawRect实现自己。
-
这可能是一种解释,但这种实现的原因可能是什么?什么都不改变的代码会改变什么?很奇怪......但是:实际的问题是别的:如何创建一个使用
drawRect:的圆形按钮@ -
为什么要打电话给
[super drawRect:rect];? -
您可能必须在您的按钮上将
opaque设置为 false。 -
super调用应该显示,即使没有任何变化,也有一些变化。 @jlehr 描述/回答了这个原因。更改按钮的opaque值不会影响图层是否绘制其背景。
标签: ios objective-c uibutton