UIButton 圆角半径在 CustomClass 中无法正常工作

UIButton corner radius not working properly in CustomClass

我为 UIButton 定制了 class,但在小屏幕设备中,例如iPhone 5s cornerRadius 工作不正常

您必须仔细观察才能看到 UiButtoncornerRadius 不是完美的圆形

class customRoundButton: UIButton
{
    override func awakeFromNib()
    {
        self.layer.cornerRadius = (self.layer.frame.height / 2)
        self.layer.borderColor = fontColor.defualtBlue.cgColor
        self.layer.borderWidth = 1
        self.layer.clipsToBounds = true
        self.layer.layoutIfNeeded()
    }
}

awakeFromNib 中设置 cornerRadius 为时过早。使用 layoutSubviews 代替:

class CustomRoundButton: UIButton {

    override func awakeFromNib() {
        super.awakeFromNib()
        layer.borderColor = UIColor.blue.cgColor
        layer.borderWidth = 1
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        layer.cornerRadius = layer.frame.height / 2
    }

}

尝试

override func layoutSubviews() {
        super.layoutSubviews()
        self.layer.cornerRadius = self.bounds.height * 0.50    
}

所以当您的自定义 UIButton 将被添加到子视图时,它会知道它的边界,您只需将角半径指定为边界高度的一半。

为此最好使用 IBDesignable

@IBDesignable
class RoundedButton: UIButton {

    @IBInspectable var cornerRadius: CGFloat = 3.0 {
        didSet {
            self.layer.cornerRadius = cornerRadius
        }
    }

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        self.setupView()
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        self.setupView()
    }

    func setupView() {
        self.layer.masksToBounds = false
        self.layer.cornerRadius = cornerRadius
    }
}

我在这里偶然发现了这个问题,发现在 Swift 5 中最有效的方法是在 Disptatch.main.async 内的 awakeFromNib 中设置拐角半径 当使用 layoutSubviewssetNeedsLayout 每个小的变化或移动都会调用闭包。这可能适用于某些用例。我没有用上面的例子尝试过。

我的代码如下所示:

override func awakeFromNib() {
    super.awakeFromNib()
    imageView.layer.masksToBounds = false
    imageView.clipsToBounds = true
        
    DispatchQueue.main.async {
        self.imageView.layer.cornerRadius = self.imageView.bounds.height / 2.0
        }
    }