【发布时间】:2015-09-21 15:45:20
【问题描述】:
所以我最近正在创建 Apple calls a leaf-level view(一个按钮),所以我按照 Apple 的文档来实现 -intrinsicContentSize 并且一切正常(尽管代码感觉有点奇怪 - 我在 -updateConstraints 方法中设置了约束定位子视图,以及 -intrinsicContentSize 方法中的代码来计算总大小应该是多少;感觉就像我向自动布局系统提供了重复的信息)。
但是,我也遇到了 post on here 声称使用刚性约束而不是使用 -intrinsicContentSize,然后容器视图将自动调整大小以适应它包含的视图。我也实现了这一点,并获得了与上面相同的结果,但是这次我不觉得我在复制发送的信息(我只是发送了直接约束)。请注意,我将上述帖子中描述的视图视为所谓的叶级视图,因为它听起来不像会添加任何其他视图。
根据里面的内容调整容器视图大小的哪种实现是正确的方法?
我目前倾向于第二种方法,因为我认为我不应该发送重复的信息,但是 Apple 的文档另有说明(再说一次,Apple 的文档有时可能有点令人困惑/误导)。
关于我的具体情况的旁注,重要的是:我的按钮中有两个子视图,一个是图像,另一个是标签。图像从标签中获取它的大小,然后从图像中获取整个按钮(因此间接地,大小完全来自标签)。
【问题讨论】:
-
如果您的视图有子视图,则它不是叶级视图。
-
@KenThomases 公平点 - 我可以轻松地使用层(这只是从 UIKit 中去除非叶子并将其放入 QuartzCore,或使用
-drawRect显示我的内容),但我的重点'我问保持关注...... -
@KenThomases 另外,作为记录,Apple 使用
button作为叶级视图的示例,这意味着UIButton是叶级视图,但在UIButton的文档有一个明显的UILabel(实际上是UIButtonLabel),用于显示文本(这是一个子视图) -
这些文档最初是为 OS X 编写的,从提到的
NSView和屏幕截图中可以看出这一点。在 OS X 上,按钮不是根据子视图实现的。不过,更重要的是,我的观点是-intrinsicContentSize的大小是视图及其“内容”固有的,而不是外在的(源自其他视图或其与它们的关系)。您的实现本质上与子视图的内部约束是多余的,这一事实意味着它不合适。 -
@KenThomases 这些都是公平的观点,但我对如何在 iOS 上完成这一点很感兴趣——当然我可以尝试遵循你概述的范式,但视图在两个平台上的操作方式是完全不同,因此这使我认为使用在 OSX 上使用的方法可能不是解决此问题的正确方法。从某种意义上说,我正在创建的这个按钮确实具有固有大小,我希望它根据按钮内的文本具有一定的大小 - 为了方便起见,我只是使用子视图(或子层),因为它看起来是正确的在 iOS 中。如果是这种情况,我应该使用
-drawRect吗?
标签: ios autolayout