调整子视图大小的自动布局问题

Posted

技术标签:

【中文标题】调整子视图大小的自动布局问题【英文标题】:AutoLayout issue with resizing subviews 【发布时间】:2013-10-08 21:15:43 【问题描述】:

我正在尝试弄清楚如何使用 Autolayout,但我发现了一个问题。我想在 IB 中创建一个大小为 200x200 的视图。这个视图,称为 PieView,有两个 UIImageViews,它们都有帧(0、0、200、200)。 我的问题是,如何在代码(我喜欢视觉格式语言)或 IB 中覆盖 updateConstraints,如果我更改 PieView 的大小(例如更改为 100),子视图也会更改(0、0、100、100 )。

以及如何更改 PieView 的大小,我正在尝试宽度和高度

NSLayoutConstraint *width = [NSLayoutConstraint constraintWithItem:self
                                                         attribute:NSLayoutAttributeWidth
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:nil
                                                         attribute:NSLayoutAttributeNotAnAttribute
                                                        multiplier:1.0f
                                                          constant:100.f];//kDiameter * sizeCoef];

【问题讨论】:

200x200 PieView 有两个带帧的图像视图(0,0,200,200)?所以图像视图是堆叠在一起的? 【参考方案1】:

如果容器视图 (PieView) 的子视图相对于它们的容器正确定位/调整大小/固定,您需要做的就是更新容器视图 (PieView) 的宽度。

要在代码中更改视图的大小,您需要确保保留对视图宽度约束的引用(例如在属性中)。因此,如果您在 Xcode 中添加了该约束,则意味着为该约束连接一个出口。或者,如果您在代码中添加它(正如您在问题中所写),只需将约束分配给属性而不是局部变量。

然后,在updateConstraints 中,将约束的constant 属性更改为新的宽度。这是一个例子:

- (void)updateConstraints

    // Probably want to wrap the below line with a check for when you should actually do this change, 
    // as updateConstraints may get called more than once (including when you aren't ready to change the width).
    self.widthConstraint.constant = 100.0f;

然后,当您准备好更改其宽度时,只需在视图上调用 setNeedsUpdateConstraints

【讨论】:

【参考方案2】:

我不确定您是否需要重新配置图像视图的高度或宽度限制。如果您希望图像视图随其父视图一起增长和缩小,那么只需将图像视图的侧面固定到 IB 中的父视图。您不需要覆盖 updateConstraints。

【讨论】:

以上是关于调整子视图大小的自动布局问题的主要内容,如果未能解决你的问题,请参考以下文章

(自动布局)容器视图调整大小但子视图不

调整子视图大小的自动布局问题

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

Cocoa 自动布局和调整子视图的大小

我们可以将具有自动布局的 XIB 加载为以编程方式创建的没有自动布局的视图的子视图,并使用父视图调整子视图的大小吗?

父 UIViewController 调整容器视图大小时,子视图控制器不自动布局