如何动态设置UIButton的拐角半径?

时间:2019-05-23 13:03:37

标签: swift

我在情节提要中有一个UIButton,该情节提要根据设备的当前方向自动调整大小。我在按钮上有一个1:1长宽比约束,并且按钮的拐角半径应始终为其宽度的一半,以使其显示为圆形。

我尝试如下更新viewDidLayoutSubviews中的拐角半径:

override func viewDidLayoutSubviews() {
    bigButton.layer.cornerRadius = 0.5 * bigButton.bounds.size.width
}

我希望它会在调整大小后根据按钮的宽度来更新拐角半径。我认为它的实际作用是根据按钮的先前宽度来更新拐角半径,从而导致其显示不正确。

是否有一种简单的方法可以在调整按钮大小后获取按钮的宽度?还是有其他方法可以达到我想要的效果?感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

我能够通过异步设置拐角半径来达到预期的效果:

override func viewDidLayoutSubviews() {
    DispatchQueue.main.asyncAfter(deadline: .now()) {
        self.bigButton.layer.cornerRadius = 0.5 * self.bigButton.bounds.size.width
    }
}

旋转动画有点笨拙,但现在应该足够了。

答案 1 :(得分:0)

您可以创建UIButton的子类,并在layer.cornerRadius中设置layoutSubviews

class RoundButton: UIButton {
    override func layoutSubviews() {
        super.layoutSubviews()

        layer.cornerRadius = bounds.height / 2
    }
}

这是一个简单的示例,可以在Playground中进行测试。通过单击,您可以看到每次更改大小时的角半径都是反应性的。

import UIKit
import PlaygroundSupport

class MyViewController: UIViewController {
    private var button: RoundButton!

    override func loadView() {
        let view = UIView()
        view.backgroundColor = .white

        button = RoundButton()
        button.contentEdgeInsets = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
        button.translatesAutoresizingMaskIntoConstraints = false
        button.addTarget(self, action: #selector(tapButton), for: .touchUpInside)
        button.setTitle("Round", for: .normal)
        button.backgroundColor = .red
        view.addSubview(button)

        NSLayoutConstraint.activate([
            button.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            button.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        ])

        self.view = view
    }

    @objc private func tapButton(_ sender: Any) {
        button.contentEdgeInsets.top += 5
        button.contentEdgeInsets.bottom += 5
    }
}

class RoundButton: UIButton {
    override func layoutSubviews() {
        super.layoutSubviews()

        layer.cornerRadius = bounds.height / 2
    }
}

PlaygroundPage.current.liveView = MyViewController()