如何使这种自动布局安排与滚动视图一起使用
Posted
技术标签:
【中文标题】如何使这种自动布局安排与滚动视图一起使用【英文标题】:How to make this auto layout arrangement work with scrollview 【发布时间】:2015-09-04 09:54:09 【问题描述】:我有一个屏幕布局,其中有两个可调整大小的标签,其中包含多行文本。这些标签被放置在它们的父视图中,实习生被添加到主内容视图中,然后主内容视图被添加到滚动视图中(大多数解决方案都建议这样做)。对于两个标签(在附加的第一张图片中的 About 和 Time 和位置标签下方),我将高度约束设置为“大于或等于”并将 numberOfLines 设置为 0 以及调用 SizetoFit,但实际输出与预期不符(见附上的第二张图片)。没有约束警告。为所有元素提供了所有约束。
对于其中一个标签,viewDidLoad 中的代码如下。
self.lblAbout.text = @"this is a long two three lines about string which will have two lines this is a long two three lines about string which will have two lines";
self.lblAbout.numberOfLines = 0;
[self.lblAbout sizeToFit];
[self.lblAbout setPreferredMaxLayoutWidth:244.0];
还有
-(void)viewDidLayoutSubviews
[super viewDidLayoutSubviews];
scrollView.contentSize = contentView.frame.size;
如果需要任何额外的约束,我已经在需要的地方添加了所有前导、尾随、顶部、底部约束以及高度,以及所有视图之间的间距。 我想要的是标签应该调整为行数,并且 contentView(父视图)应该在 ScrollView 内滚动,因为总高度将大于可用的屏幕。
*** 我认为的问题是标签的外部视图没有根据标签调整大小,因为它下面的所有视图都没有重新定位****
【问题讨论】:
您正在使用带有自动布局的滚动视图,希望我的这个答案能帮助您清除如何处理带有自动布局的滚动视图的概念***.com/a/30804676/3767017\ @iosDev82 问题是双重的 我认为滚动不起作用,因为调整大小没有发生,尽管我已经设置了所有的约束,但我可能会错过一些必要的约束,我可能会。请注意。 不确定为什么需要尝试和操作布局。如果您的约束是正确的,它应该都可以正常工作。我会删除你的 sizeToFit 调用和 viewDidLayoutSubviews 代码。在viewDidLoad
中进行布局没有任何意义,因为尚未在任何地方进行布局。如果有任何事情,请在您的 viewWillAppear
方法中调用 [contentView setNeedLayout]
和 [contentView layoutIfNeeded]
。
您可能仍需要查看WillLayoutSubviews 代码并将contentSize 设置为contentView.bounds.size
。您可能会发现这很有用:developer.apple.com/library/ios/technotes/tn2154/_index.html
UIScrollView 本身的位置固定了吗?它应该固定到顶部布局、底部布局、前导和尾随以便强制滚动?
【参考方案1】:
请尝试此解决方案, 1。将高度约束添加到标签的超级视图。 2。添加该约束的 IBOutlet 3。添加此方法以找出文本的高度 您需要提供标签的超级视图的宽度,因此宽度将与您的超级视图相同 4。现在获取高度表单返回的 CGRect 并将其分配给您的约束常量。应该是这样的
heightConstraint.constant = youObject.size.height;
请确保您已相应地添加了其他约束。如果不是,您还需要相应地增加其他超级视图的高度。
(CGRect)sizeOfDetailLabelFromString:(NSString*)string maxWidth:(CGFloat)maxWidth
NSDictionary *attributes = @NSFontAttributeName:FONT_LIGHT;
CGRect rect = [string boundingRectWithSize:CGSizeMake(maxWidth, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:attributes context:nil];
return rect;
【讨论】:
我认为增加 contentView 的高度,这是所有控件的超级视图,但由于我至少有 8 个不同的控件,所以似乎很难 所以,为此只需连接 superView 的 heightConstraints 插座,并且该标签的 superview 使用可以给予 Hugging 优先级,所以基本上逻辑是如果 superView 中剩余的空间比其子视图将根据需要扩展。 如果您愿意,我可以帮助您添加约束。 就标签的大小而言,它实际上正在调整,它与标签的超级视图有关,我正在尝试一些事情,谢谢 让我们continue this discussion in chat。【参考方案2】:这是最终奏效的方法。
-
在主视图中添加了 ScrollView
将 View 添加为 contentView(请务必在设计器中将其重命名为不仅仅是 view)
使用前导尾随顶部和底部空间约束将滚动视图固定到主视图。
将 contentView 固定到与上面相同的滚动视图
添加了所有组件及其各自的约束
使用“大于或等于约束(这是必要的)设置我想要调整大小的 UILabel 的高度,并在代码中将行数设置为 0
label 的父视图不应有任何固定高度,但应有足够的约束来在运行时计算它。
确保 ScrollView 在计算 contentSize 时没有歧义。
imp - 为 Main view , scrollview , contentView 的宽度添加约束(在我的例子中,你可能不需要 contentView 和 scrollview 之间的等宽约束,但 contentView 和主视图之间是必要的)
现在滚动视图完全按照它需要的方式滚动。
据我所知,上述大部分事情我已经做过,但不知何故它不起作用,删除了所有东西,然后又做了几次,它起作用了。
【讨论】:
以上是关于如何使这种自动布局安排与滚动视图一起使用的主要内容,如果未能解决你的问题,请参考以下文章