修改超级视图框架时自动调整子视图

时间:2018-05-31 07:38:10

标签: ios swift uiview autolayout

我有一个带有内部红色矩形(viewB)的绿色矩形(viewA)。如果我尝试修改viewA的维度,则viewB不会自动更改。

我试着:

  • 检查autoresizesSubviews值(是真)
  • 设置autoresizingMask
  • 更改边界而不是超视图的框架

所有这些解决方案都不起作用。

这是我的代码:

@IBOutlet weak var viewA: UIView!

@IBOutlet weak var button: UIButton!

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

@IBAction func buttonAction(_ sender: Any) {
    viewA.autoresizesSubviews = true
    self.viewA.autoresizingMask = [.flexibleWidth, .flexibleHeight,.flexibleTopMargin, .flexibleLeftMargin, .flexibleRightMargin, .flexibleBottomMargin]
    viewA.bounds = CGRect(x: 0, y: 0, width: 100, height: 100) // or frame instead of bounds
}

enter image description here enter image description here

感谢大家。

修改

我在故事板中添加了两个视图。在这里你还可以看到viewB的约束。

enter image description here

2 个答案:

答案 0 :(得分:1)

不要混淆视图的框架和自动布局,两者的行为都不同。

您需要执行以下操作。

  

viewA的约束

  • CenterX和CenterY
  • (高度或宽度)和宽高比1:1(表示相等的宽度和相等的高度)
  

viewB的约束

  • 领先,尾随,顶部和底部到其超级视图(即viewA)

现在您需要为需要修改的约束(viewA)创建@IBOutlet

@IBOutlet weak var const_height_viewA: NSLayoutConstraints!

因此,在按钮单击时,您只需要更改约束的常量。

@IBAction func buttonAction(_ sender: Any) {
    const_height_viewA.constant = 250
    //changing height constraint of viewA will automatically updates viewB frame.
}

注意:无需修改viewB的约束,因为它会根据给定的约束自动调整。

图示参考

enter image description here

答案 1 :(得分:0)

如果您使用的是AutoLayout,则不应更改框架。如果您使用的是AutoLayout,最好将约束更新为您想要的值,而不是更改框架。

请注意docs中的“经验法则”部分中的第一个点。

相关问题