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

Posted

技术标签:

【中文标题】修改超级视图的框架时自动调整子视图的大小【英文标题】: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。 我在情节提要中添加了两个视图,并根据超级视图的边界设置了一些约束,但它不起作用。 (请参阅问题中的编辑) 【参考方案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 中“经验法则”部分的第一点。

【讨论】:

以上是关于修改超级视图的框架时自动调整子视图的大小的主要内容,如果未能解决你的问题,请参考以下文章

调整超级视图大小时自动调整子视图

根据最大的子视图使用自动布局调整超级视图的大小

使用自动布局动态更改子视图后调整超级视图的大小

根据子视图调整超级视图的大小

使用自动布局调整超级视图和所有超级视图的兄弟姐妹的大小

从 Xib 加载视图在自动布局后调整框架子视图的大小