【问题标题】:Autoresize subviews when the frame of superview is modified修改超级视图的框架时自动调整子视图的大小
【发布时间】:2018-05-31 07:38:09
【问题描述】:

我有一个绿色矩形 (viewA) 和一个内部红色矩形 (viewB)。如果我尝试修改 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
}

谢谢大家。

编辑:

我在情节提要中添加了两个视图。这里也可以看到viewB的约束。

【问题讨论】:

  • 您需要更改视图B。边界也,否则显示代码你将如何将子视图添加到 viewA
  • 显示 ViewA & viewB 的视图层次结构
  • 不要使用自动调整大小的蒙版。只需将自动布局约束添加到界面构建器中的视图即可。那么你就不需要任何代码了。
  • 确保按钮是viewA的子视图,然后你正在改变viewA的边界。按钮的边界取决于 viewA。
  • 我在情节提要中添加了两个视图,并根据超级视图的边界设置了一些约束,但它不起作用。 (请参阅问题中的编辑)

标签: ios swift uiview autolayout


【解决方案1】:

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

您需要执行以下操作。

viewA 的约束

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

viewB 的约束

  • 到其父视图(即 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 的约束,因为它会根据给定的约束自动调整。

图片参考

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多