我在情节提要中有一个UIButton
,该情节提要根据设备的当前方向自动调整大小。我在按钮上有一个1:1
长宽比约束,并且按钮的拐角半径应始终为其宽度的一半,以使其显示为圆形。
我尝试如下更新viewDidLayoutSubviews
中的拐角半径:
override func viewDidLayoutSubviews() {
bigButton.layer.cornerRadius = 0.5 * bigButton.bounds.size.width
}
我希望它会在调整大小后根据按钮的宽度来更新拐角半径。我认为它的实际作用是根据按钮的先前宽度来更新拐角半径,从而导致其显示不正确。
是否有一种简单的方法可以在调整按钮大小后获取按钮的宽度?还是有其他方法可以达到我想要的效果?感谢您的帮助!
答案 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()