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

Posted

技术标签:

【中文标题】UIButton 圆角半径在 CustomClass 中无法正常工作【英文标题】:UIButton corner radius not working properly in CustomClass 【发布时间】:2019-05-03 06:00:39 【问题描述】:

我已经为 UIButton 创建了一个自定义类,但在小屏幕设备中,例如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()
    


【问题讨论】:

self.layer.cornerRadius = (self.layer.frame.height / 2) 改为layoutSubviews。你也可以去掉self.layer.layoutIfNeeded()这一行。 正如@AndréSlotta 提到的那样,在func layoutSubviews() 方法中设置你的圆角半径 运气不好,行不通。 @Bhavesh 你能显示你更新的代码吗? @Bhavesh 这里没有运气。你试过了吗? 【参考方案1】:

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
    


【讨论】:

【参考方案2】:

试试

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

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

【讨论】:

【参考方案3】:

最好使用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
    

【讨论】:

【参考方案4】:

我在这里偶然发现了这个问题,并发现在 Swift 5 中最有效的方法是在 awakeFromNib 内设置角半径 Disptatch.main.async 当使用 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
        
    

【讨论】:

以上是关于UIButton 圆角半径在 CustomClass 中无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

将圆角半径应用于递减按钮

Swift 3 - 自定义 UIButton 半径删除约束?

两个 UIButton 形成一个具有渐变颜色,另一个具有边框和圆角

仅将角半径设置为 UIView/UIButton 的特定侧

Swift:以编程方式在键盘上方添加 UIButton

如何将渐变边框颜色应用于 UIButton?