0

我写了一个小的 UIView 子类来显示进度 HUD。HUD 视图效果很好,但在最后几天我遇到了一个小问题。

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

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

但是当第二个视图被添加为子视图时,我在这个视图中添加了一个 HUD。当第二个视图调整到原始高度时,HUD 会粘在视图的顶部并且只有几个像素高: 在此处输入图像描述

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

有人对此有一个好主意吗?或者是否有人知道关于这些限制的良好且解释清楚的资源?

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

4

1 回答 1

0

在好的资源方面,我绝对推荐 WWDC2012 的 3 个视频:OSX/iOS 的 Auto Layouts 简介、Auto Layout by Example 和 Best Practices for Mastering Auto Layout。这些有一些提示,用于查看布局中的歧义和处理冲突

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

重新解决你的问题。我假设您没有看到错误消息,并且您将进度 HUD 完全放在 XIB 中。如果是这样,听起来你有两个约束在 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 中调用它们,它甚至可以为外观设置动画......俗气

希望这会有所帮助——这可能更像是朝着解决方案迈出的一步,而不是解决方案本身。在 AutoLayout by Example 视频中也推荐第 17 分钟和第 53 分钟。

史蒂夫

于 2013-02-09T15:13:49.280 回答