Невозможно установить угловой угол UIB-кнопки, которая была создана программно в быстром - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь установить cornerRadius для UIButton так, чтобы оно выглядело круглым, но я не могу этого сделать.

Вот код того, что я пробовал.

func addColorButton() {
    let colorButton : UIButton = {
        let cb = UIButton()
        cb.translatesAutoresizingMaskIntoConstraints = false
        cb.backgroundColor = .black

        return cb
    }()

    view.addSubview(colorButton)
    colorButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    colorButton.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -10).isActive = true
    colorButton.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.5).isActive = true
    colorButton.heightAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.5).isActive = true
    colorButton.layer.cornerRadius = 0.5 * colorButton.bounds.size.width
    print(colorButton.bounds.width)
    colorButton.clipsToBounds = true

}
 override func viewDidLoad() {
    super.viewDidLoad()

   addColorButton()
}

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

Я думаю, что для этого нужно использовать masksToBounds.

colorButton.layer.masksToBounds = true
0 голосов
/ 22 мая 2018

Вы можете создать простой подкласс, который можно использовать, когда вам нужно.

Я просто показываю ссылку на UIButton с тенями и закругленными углами. Вы можете сделать IBInspectable использовать эти свойства из раскадровки.

class UIButtonShadow: UIButton {

var yPos : CGFloat = 2 {
    didSet {
        addBehavior()
    }
}

var radius : CGFloat = 2 {
    didSet {
        addBehavior()
    }
}

var cornerRadius : CGFloat = 18 {
    didSet {
        addBehavior()
    }
}


override var bounds: CGRect {
    didSet {
        addBehavior()
    }
}

override var frame: CGRect{
    didSet{
        addBehavior()
    }
}

override init(frame: CGRect) {
    super.init(frame: frame)
    addBehavior()
}

override func awakeFromNib() {
    super.awakeFromNib()
    addBehavior()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

func addBehavior() {
    self.layer.cornerRadius = cornerRadius
    let shadowPath = UIBezierPath(roundedRect:self.bounds,cornerRadius:self.layer.cornerRadius)
    self.layer.masksToBounds = false
    self.layer.shadowColor =  UIColor.black.cgColor
    self.layer.shadowOffset = CGSize(width:0.0,height:yPos)
    self.layer.shadowOpacity = 0.3
    self.layer.shadowPath = shadowPath.cgPath
    self.layer.shadowRadius = radius
}

}

0 голосов
/ 22 мая 2018

Кнопки bounds / frame не будут установлены до тех пор, пока не завершится автоперемещение.Вы можете обновить,

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews() 

    // Update corner radius here
    colorButton.layer.cornerRadius = 0.5 * colorButton.bounds.size.width
}
...