UIView子视图自动调整大小

时间:2013-02-07 01:07:41

标签: uiview autoresize autoresizingmask nslayoutconstraint

我写了一个小UIView子类来显示进度HUD。那个HUD视图很完美,但我在最后几天遇到了一些问题。

在我的应用程序中,我以自定义方式呈现UIViewController。当用户在tableView中选择一行时,我正在创建第二个viewController的实例,将其移动到当前VC,将其视图的高度设置为零,将其添加为当前VC视图的子视图(在所选的位置)细胞)并将高度设置为原始动画。

这种行为看起来非常酷,效果很好。

但是当第二个视图添加为子视图时,我正在为此视图添加HUD。当第二个视图调整到原始高度时,HUD会粘到视图的顶部,只有几个像素高: enter image description here

我和NSLayoutConstraints玩了一下......但直到现在我才开始工作......

有人对那个有个好主意吗?或者有没有人知道关于这些限制的良好且解释良好的资源?

HUD实际上是一个背景视图,小窗口作为子视图。所有其他元素(进度视图,标签等)都是小窗口的子视图。

1 个答案:

答案 0 :(得分:0)

在良好的资源方面,我绝对推荐WWDC2012的3个视频:OSX / iOS自动布局简介,示例自动布局以及掌握自动布局的最佳实践。这些有一些提示,可以查看布局中的歧义和处理冲突

另一个很好的参考是Erica Sadun的iOS6食谱书。

重新解决你的问题。我假设您没有看到错误消息,并且您正在XIB中完全布局进度HUD。如果是这样,听起来你有两个不符合你喜欢的xib条件 - superView顶部的高度和HUD的高度

首先,为.h文件的约束创建一个出口

@property (strong) IBOutlet NSLayoutConstraint *HUDSuperViewToHUDConstraint;
@property (strong) IBOutlet NSLayoutConstraint *HUDHeight;

接下来,在使用HUD打开新viewController的方法中,删除约束,以便在首次显示新视图时不会发生冲突

[HUDSuperView removeConstraint:self.HUDSuperViewToHUDViewConstraint];
[HUDSuperView removeConstraint:self.HUDHeight];

第一次调用[HUDSuperView layoutIfNeeded]之后,在动画中或任何地方添加约束并再次调用layoutIfNeeded

[HUDSuperView addConstraint:self.HUDSuperViewToHUDViewConstraint];
[HUDSuperView addConstraint:self.HUDHeight];
[HUDSuperView layoutIfNeeded];

如果你在animateWithDuration中调用它们,它甚至可以为外观设置动画...... cheesey

希望这会有所帮助 - 它可能更倾向于解决方案,而不是解决方案本身。在AutoLayout by Example视频中也推荐会议记录17和53.

史蒂夫