根据子类中的 UIButton 大小设置cornerRadius 的最佳位置?

Posted

技术标签:

【中文标题】根据子类中的 UIButton 大小设置cornerRadius 的最佳位置?【英文标题】:Best place to set cornerRadius based on UIButton size in subclass? 【发布时间】:2015-07-27 13:06:47 【问题描述】:

所以我将在应用程序中使用几个不同的圆形按钮(一直到圆形按钮),据我所知,实现这一点的最简单方法是设置按钮 CALayer 的cornerRadius 属性。

但是,我不想为每个控制器中需要它的每个按钮手动执行此操作,因此我认为在 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)
    

但我发现在这一点上(即 init),框架和边界的大小都不是最终的。对于 Storyboard 中大小(和约束)为 H40 x W40 的按钮,边界/帧大小显示为 H30 x W38。

这意味着cornerRadius没有得到我期望的值。

我已经确认在稍后的某个时间点(例如,当按钮已经可以响应点击时)它的框架/边界确实是 H40 x W40。

毕竟,我的问题是,在 UIButton 子类中,何时/在何处可以使用实例的最终帧/边界值安全地设置cornerRadius?

【问题讨论】:

【参考方案1】:

如果您希望在视图通过 AutoLayout 之后执行代码,您必须在调用 super.layoutSubviews() 后在 layoutSubviews 中执行。

像这样:

class RoundedButton: UIButton 

    override func layoutSubviews() 
        super.layoutSubviews()

        layer.cornerRadius = bounds.size.height / 2.0
        clipsToBounds = true
    

此代码并不完美,因为它不支持高度大于宽度的情况(虽然很容易修复......)。

【讨论】:

由于所有答案都是相同的,而且您的答案是第一位的,所以我会接受您的答案。谢谢。我实际上并没有提到我只关心高度而不关心宽度的原因是因为我知道我所有的按钮都是正方形或水平矩形。但是,是的,更通用的解决方案是寻找两个维度中较小的一个。 这有可能被多次调用,不必要地反复设置值仅供参考【参考方案2】:

在 Button 类中试试这个。

override func layoutSubviews() 
    super.layoutSubviews()

    // here...

【讨论】:

【参考方案3】:

由于您希望使用 initWithCoder 而不是 initWithFrame(您确实有框架结构),您可以覆盖 layoutSubviews 方法。 当 layoutSubviews 被调用时,框架是正确的。

在objective-c中你可以写

- (void)layoutSubviews 
    [super layoutSubviews];
    self.layer.cornerRadius = self.bounds.size.height/2;


【讨论】:

以上是关于根据子类中的 UIButton 大小设置cornerRadius 的最佳位置?的主要内容,如果未能解决你的问题,请参考以下文章

子类化 UIButton 标题字体大小意外更改

UIButton 子类 initWithCoder 中的 setTitleColor:forState 未设置颜色

UIButton 的帧大小何时最终设置

设置新图像后调整 UIButton 的大小

UIButton 子类@IBAction 不起作用

Swift UIButton 子类并根据变量更改颜色