以下问题是这个问题的延续:
iOS:自动布局中的多行 UILabel https://stackoverflow.com/questions/12789013/ios-multi-line-uilabel-in-auto-layout
主要思想是每个视图都应该声明它的“首选”(固有)大小,以便自动布局可以知道如何正确显示它。
UILabel 只是视图情况的一个示例cannot本身就知道显示需要什么尺寸。这取决于提供的宽度。
As mwhuss指出,设置首选最大布局宽度做了使标签跨越多行的技巧。但这不是这里的主要问题。问题是我何时何地得到这个width我作为参数发送的值设置首选最大布局宽度.
我设法做出了一些看起来合法的东西,所以如果我有任何错误,请纠正我,如果你知道更好的方法,请告诉我。
在 UIView 中
-(CGSize) intrinsicContentSize
I 设置首选最大布局宽度根据 self.frame.width 为我的 UILabels 。
UI视图控制器
-(void) viewDidLayoutSubviews
是我知道的第一个回调方法,其中主视图的子视图指定了它们在屏幕上所驻留的确切框架。然后,在该方法内部,我对子视图进行操作,使它们的固有大小无效,以便 UILabels 根据指定的宽度分成多行。
这个问题有一个答案objc.io http://www.objc.io/在“多行文本的固有内容大小”部分中高级自动布局工具箱 http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html。这是相关信息:
对于多行文本,UILabel 和 NSTextField 的内在内容大小是不明确的。文本的高度取决于线条的宽度,这在求解约束时尚未确定。为了解决这个问题,这两个类都有一个名为preferredMaxLayoutWidth的新属性,它指定计算内在内容大小的最大线宽。
由于我们通常不会提前知道这个值,因此我们需要采取两步方法来获得正确的结果。首先,我们让自动布局完成其工作,然后我们在布局过程中使用生成的帧来更新首选最大宽度并再次触发布局。
他们给出的在视图控制器内使用的代码:
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
[self.view layoutIfNeeded];
}
看看他们的帖子,有更多关于为什么需要进行两次布局的信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)