ios - "Stack"UIViewController 中的 UIViews (iOS 7)

标签 ios iphone objective-c uiview

我是一个新手 iOS 开发人员,我有一个简单的问题,我已经把头发拉了几天。

首先,我没有在 XCode 中使用 Interface Builder,因为有人告诉我最好的学习方法是通过代码来构建所有内容。

话虽如此,我有一个自定义 UIViewController ,我在其中添加 subview 。我的问题是,当它们具有可变高度时,我如何自动“堆叠”它们?我所说的“堆栈”是指以下内容:

|------------------------------------|
|                                    |
|      View 1 (variable height)      |
|                                    |
|------------------------------------|
|------------------------------------|
|                                    |
|      View 2 (variable height)      |
|                                    |
|------------------------------------|
|------------------------------------|
|                                    |
|      View 3 (variable height)      |
|                                    |
|------------------------------------|

现在,一旦所有 subview 都被渲染,我正在计算每个 subview 的重载“sizeToFit”函数中每个 subview 的起点/高度。有些 View 包含 UIWebView,我在其中等待它们加载以计算高度。

有一种更优雅的方法可以做到这一点,不是吗?

任何代码示例将不胜感激!

谢谢你的时间!

最佳答案

使用自动布局!

Auto Layout 所做的是根据您提供的约束为您管理 UI 布局。例如,在上面的 View 层次结构中,您希望对 View 的高度进行约束,并在每个 View 之间进行约束,最后对 View 的 super View 进行约束。

由于您在代码中执行所有操作,因此您要做的第一件事是调用 setTranslatesAutoresizingMaskIntoConstraints:在每个 View 上,值为 NO .这告诉布局系统您希望使用自动布局并自己设置所有约束。

接下来,您应该为所有 View 提供约束。约束有多种形式: View 和自身之间的约束(高度、宽度等); View 和对等体之间的约束 - 共享相同 super View 的两个 View 之间的约束;以及 View 与其父 View 之间的约束。自动布局系统不喜欢模棱两可,因此您必须提供没有问题的约束。对于上面的示例,您必须设置每个 View 的高度、它在 super View 中的位置以及一个 View 与另一个 View 之间的距离。

更高级的主题包括固有大小,它会告诉自动布局您的 View 可能会根据其内容动态地增长和缩小,并且其他人也会做出相应的 react 。

定义约束的最简单方法是使用可视化格式。

我建议从这些开始:

  • Apple's guide on Auto Layout
  • A good visual format guide
  • Apple's WWDC2012 introduction keynote on Auto Layout


  • 关于在代码中做 UI 与 Interface Builder 的一句话。让我告诉你,不要为了 UI 代码而学习 UI 代码。提出一个想法,然后开始实现这个想法。从界面生成器开始。你会慢慢了解 View 是如何工作的,它们是如何布局的,约束是如何工作的,布局引擎是如何使用约束的等等。在 Xcode 5 中,AutoLayout 已经成为一种使用的乐趣,而在 Xcode 5.1 中,事情变得更好了。从 Interface Builder 开始,您最终将获得代码,并随着时间的推移学习完成任务所需的一切。

    学习不应该是“哦,我知道如何在代码中添加 View !”;学习应该是“我知道如何解决我必须完成或克服的问题”。如果您的所有任务都可以使用 Interface Builder 工具完成,那就太好了。使用 IB 解决不了的问题?更好的是,现在您正在了解 View 和布局的内部工作原理。

    祝你好运!

    关于ios - "Stack"UIViewController 中的 UIViews (iOS 7),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22236698/

    相关文章:

    ios - 什么是便利构造函数。我需要保留便利构造函数返回的对象吗

    javascript - iOS 12 Safari 的私有(private)/隐身模式检测

    ios - 如何根据swift中的条件替换方法名称?

    iphone - GHUnit 在模拟器中运行,但不能在 iPhone 上运行

    iphone - 从异步 url 连接返回数据给调用者

    ios - 如何再次显示 "Would like to send you Push Notifications"警报 View ?

    iphone - 带有 super View 的 iOS 统一缩放 subview

    objective-c - NSString 的类别或 Web API 使英文单词复数化?

    ios - 使用 sizeThatFits : doesn't work 调整 UIWebView 的大小

    ios - 读取数组元素的预期方法在 'id<ProtocolName>' 类型的对象上找不到