限制在超级视图中水平和垂直居中阻止我更改框架

Posted

技术标签:

【中文标题】限制在超级视图中水平和垂直居中阻止我更改框架【英文标题】:Constraining to center horizontally & vertically in superview prevents me from changing the frame 【发布时间】:2015-07-06 02:16:49 【问题描述】:

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

我想为UIButton 添加一个边框并使其变圆。在关注answer on SO 之后,我能够使按钮部分变圆。

但由于某种原因,按钮并不是真正的圆形。我认为这是因为我的高度和宽度不相等。每次我将按钮的宽度/高度设置为相等时,自动布局约束都会将其重置为 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 的回答让我得到了想要的效果。

【问题讨论】:

【参考方案1】:

您需要添加有关按钮高度和宽度的约束。

固定宽度和高度,或纵横比都可以。

如果你使用纵横比,在viewDidLayoutSubviews中设置圆角半径

【讨论】:

以上是关于限制在超级视图中水平和垂直居中阻止我更改框架的主要内容,如果未能解决你的问题,请参考以下文章

超级视图框架更改后更新子视图的约束

-水平居中垂直居中水平垂直居中

如何垂直居中两个视图并相对于超级视图平均划分宽度?

如何在堆栈中垂直或水平居中小部件?

绝对定位情况下水平垂直居中小技巧

我如何在乳胶中垂直和水平居中报价?