在 superview 中限制水平和垂直居中会阻止我更改框架

Constraining to center horizontally & vertically in superview prevents me from changing the frame

我在 UIView 中有一个 UIButton,有两个约束。这两个约束都在 Interface Builder 中设置,因此 UIButton 在其父视图中垂直和水平居中。

我想给 UIButton 添加边框并使其变圆。遵循 answer on SO 后,我能够使按钮部分变圆。

虽然出于某种原因,按钮并不是真正的圆形。我认为这是因为我的高度和宽度彼此不相等。每次我将按钮的 width/height 设置为相等时,自动布局约束将其重置回 40x34。

我正在使用以下代码创建圆形按钮。

self.startButton.clipsToBounds = true
self.startButton.layer.cornerRadius = self.startButton.frame.height / 2
self.startButton.layer.borderWidth = 1
self.startButton.layer.borderColor = self.view.tintColor.CGColor
self.startButton.layer.shadowRadius = 6.0
self.startButton.layer.shadowColor = UIColor.blackColor().CGColor
self.startButton.layer.shadowOffset = CGSizeMake(0.0, 3.0)
self.startButton.layer.shadowOpacity = 0.65

为什么让我的按钮垂直和水平居中会阻止我改变它的大小?我不明白为什么我不能设置按钮的大小并让约束根据我分配给它的大小值重新居中。

编辑

我已将代码移到 viewDidLayoutSubviews 中,然后修改了约束,使高度和宽度都被限制为 40x40。

override func viewDidLayoutSubviews() {
    self.startButton.clipsToBounds = true
    self.startButton.titleLabel?.text = "Start"
    self.startButton.layer.cornerRadius = self.startButton.frame.height / 2
    self.startButton.layer.borderWidth = 1
    self.startButton.layer.borderColor = self.view.tintColor.CGColor
    self.startButton.layer.shadowRadius = 6.0
    self.startButton.layer.shadowColor = UIColor.blackColor().CGColor
    self.startButton.layer.shadowOffset = CGSizeMake(0.0, 3.0)
    self.startButton.layer.shadowOpacity = 0.65
}

这部分解决了我的问题;虽然不完全。如果我不给 titleLabel 赋值,那么这个按钮就是一个合适的圆形按钮。

但是,如果我为 titleLabel 赋值,按钮将变为圆角矩形而不是圆形。

文本没有出现在按钮中,这让我很困惑。我需要让按钮成为一个圆圈,缩放以适应它的内容。我的按钮类型设置为 Custom。不知道对这个有没有影响

编辑 2

经过一些测试后,我发现我正在为按钮设置边缘插入。一旦我删除了以下内容:

self.startButton.contentEdgeInsets = UIEdgeInsets(top: 25, left: 25, bottom: 25, right: 25)

@Leo 的回答达到了我想要的效果。

您需要添加有关按钮高度和宽度的限制。

固定宽度和高度,或者宽高比单选都可以。

如果你使用 aspect radio,请在 viewDidLayoutSubviews

中设置圆角半径