自动布局不是那么自动
Auto Layout Not So Auto
我已经进行了最基本的设置。见图一:
信不信由你,这是我使用 AutoLayout 的第一个项目,我之前已经通过编程创建了所有内容。这个基本设置实际上是一个 UIWebView
,底部有 1 个自定义 UIView
。以前我使用的是一个工具栏,它可以为我处理所有事情,并且没有任何约束问题。但是,在将 UILongPressGesture
添加到 UIBarButtonItem
的子视图时,工具栏会产生事件处理差异,因此我决定将工具栏转换为 UIView
(甚至将 UIView 插入到工具栏,它自然会转换为按钮项)以便于处理。但是 run-time,视图被推离屏幕 UIView
大小的一半(48px)参见图 2。然后当我添加按钮时,情况变得更糟:
我已经查看了文档和支持 HERE,但没有结果。我总共花了大约 24 小时研究它并学到了很多东西,所以我的努力没有白费。 我知道 'Adding Missing Constraints',约束只是基于当前设置的建议,并非在所有情况下都是具体的,所以我确实尝试创建自己的控制在查看文档后进行拖动,但我的设置得出的结果没有什么不同,而且更加草率。所以我决定在下面包含 Xcode 填充的约束:
UIWebView 约束
自定义 UIView(工具栏)约束
有什么可靠的起点建议吗?内在尺寸与它有什么关系吗?
编辑:工作约束 我没有意识到您可以简单地省略一个约束。罪魁祸首似乎是在顶部布局指南中添加了一个。
仅供回答者@Matt :
常量 0 结果: 边缘有小间隙
-16 for leading space/trailing space 结果在我的案例中是一个真正的工具栏仿真,没有突出的警告或问题。谢谢
让我们谈谈界面底部的视图,以及如何使用自动布局来定位和调整它的大小,就像工具栏的定位和大小一样。
要使用自动布局,您需要提供足够的信息来确定位置和大小。该视图是视图控制器主视图的子视图。主视图将根据屏幕调整大小,因此我们也想使用自动布局来调整子视图 ("toolbar") 的大小。这就是自动布局的用途!
所以将子视图的前缘约束到父视图的前缘,并将子视图的后缘约束到父视图的后缘,两者的 constant
都为 0。现在左右边缘匹配超级视图!
这会处理水平位置和大小。
现在让我们谈谈垂直位置。位置应该是底部。因此,将子视图底部边缘约束到视图控制器的底部布局指南,再次使用 constant
0。现在视图底部位于底部!
我们唯一不知道的是子视图的顶部。在我们的情况下,这与知道它的高度相同。所以给子视图一个高度约束,将它的 constant
设置为一个合理的值,比如 40,就大功告成了。
我已经进行了最基本的设置。见图一:
信不信由你,这是我使用 AutoLayout 的第一个项目,我之前已经通过编程创建了所有内容。这个基本设置实际上是一个 UIWebView
,底部有 1 个自定义 UIView
。以前我使用的是一个工具栏,它可以为我处理所有事情,并且没有任何约束问题。但是,在将 UILongPressGesture
添加到 UIBarButtonItem
的子视图时,工具栏会产生事件处理差异,因此我决定将工具栏转换为 UIView
(甚至将 UIView 插入到工具栏,它自然会转换为按钮项)以便于处理。但是 run-time,视图被推离屏幕 UIView
大小的一半(48px)参见图 2。然后当我添加按钮时,情况变得更糟:
我已经查看了文档和支持 HERE,但没有结果。我总共花了大约 24 小时研究它并学到了很多东西,所以我的努力没有白费。 我知道 'Adding Missing Constraints',约束只是基于当前设置的建议,并非在所有情况下都是具体的,所以我确实尝试创建自己的控制在查看文档后进行拖动,但我的设置得出的结果没有什么不同,而且更加草率。所以我决定在下面包含 Xcode 填充的约束:
UIWebView 约束
自定义 UIView(工具栏)约束
有什么可靠的起点建议吗?内在尺寸与它有什么关系吗?
编辑:工作约束 我没有意识到您可以简单地省略一个约束。罪魁祸首似乎是在顶部布局指南中添加了一个。
仅供回答者@Matt :
常量 0 结果: 边缘有小间隙
-16 for leading space/trailing space 结果在我的案例中是一个真正的工具栏仿真,没有突出的警告或问题。谢谢
让我们谈谈界面底部的视图,以及如何使用自动布局来定位和调整它的大小,就像工具栏的定位和大小一样。
要使用自动布局,您需要提供足够的信息来确定位置和大小。该视图是视图控制器主视图的子视图。主视图将根据屏幕调整大小,因此我们也想使用自动布局来调整子视图 ("toolbar") 的大小。这就是自动布局的用途!
所以将子视图的前缘约束到父视图的前缘,并将子视图的后缘约束到父视图的后缘,两者的 constant
都为 0。现在左右边缘匹配超级视图!
这会处理水平位置和大小。
现在让我们谈谈垂直位置。位置应该是底部。因此,将子视图底部边缘约束到视图控制器的底部布局指南,再次使用 constant
0。现在视图底部位于底部!
我们唯一不知道的是子视图的顶部。在我们的情况下,这与知道它的高度相同。所以给子视图一个高度约束,将它的 constant
设置为一个合理的值,比如 40,就大功告成了。