【问题标题】:UIButton corner radius not working properly in CustomClassUIButton 圆角半径在 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 这里没有运气。你试过了吗?

标签: ios swift uibutton cornerradius


【解决方案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
                }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-05
          • 2014-01-20
          • 2019-03-03
          • 1970-01-01
          • 1970-01-01
          • 2011-06-29
          相关资源
          最近更新 更多