所以我会在应用程序中有一些不同的圆形按钮(一直到圆形按钮),从我所知道的,最简单的方法是设置按钮CALayer的cornerRadius属性。 / p>
但是,我不想为每个控制器中需要它的每个按钮手动执行此操作,因此我认为在init上设置此类的简单子类就是这样。
我正在使用Storyboard和Autolayout来定位和调整按钮的大小,并将它们分配给这个子类。
class RoundedButton: UIButton {
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.layer.cornerRadius = self.bounds.size.height / 2.0
self.clipsToBounds = true
NSLog("BUTTON BOUNDS: H-%f W-%f", self.bounds.size.height, self.bounds.size.width)
NSLog("BUTTON FRAME: H-%f W-%f", self.frame.height, self.frame.width)
}
}
但是我已经发现在这一点(即初始化),框架和边界的大小都不是最终的。对于Storyboard中尺寸(和约束)为H40 x W40的按钮,边界/框架尺寸显示为H30 x W38。
这意味着cornerRadius没有得到我期望的值。
我已经确认在稍后的某个时间点(例如,当按钮已经响应了一个水龙头时)它的帧/边界确实是H40 x W40。
毕竟,我的问题是,在UIButton子类中,何时/哪里可以使用实例的最终帧/边界值安全地设置cornerRadius?
答案 0 :(得分:19)
如果您希望在视图通过AutoLayout后执行代码,则必须在调用layoutSubviews
后在super.layoutSubviews()
中执行此操作。
像这样:
class RoundedButton: UIButton {
override func layoutSubviews() {
super.layoutSubviews()
layer.cornerRadius = bounds.size.height / 2.0
clipsToBounds = true
}
}
这段代码并不完美,因为当高度大于宽度时它不支持(虽然容易修复......)。
答案 1 :(得分:1)
在Button类中尝试此操作。
override func layoutSubviews() {
super.layoutSubviews()
// here...
}
答案 2 :(得分:1)
由于您希望使用initWithCoder而不是initWithFrame(您确实拥有框架结构),因此可以覆盖layoutSubviews方法。 调用layoutSubviews时,框架是正确的。
在objective-c中你可以写
- (void)layoutSubviews {
[super layoutSubviews];
self.layer.cornerRadius = self.bounds.size.height/2;
}