如何使 UIScrollView 与自动布局和动态内容一起使用? [复制]
Posted
技术标签:
【中文标题】如何使 UIScrollView 与自动布局和动态内容一起使用? [复制]【英文标题】:How to make an UIScrollView work with Autolayout and dynamic content? [duplicate] 【发布时间】:2015-12-16 11:14:20 【问题描述】:我在xib
文件中有这个视图层次结构:
UIView
UIScrollView
UIView
UIView
UITableView
UIButton
我们将contentView
称为UIView
,它是UIScrollView
的直接子代。我已经设置了它的顶部、底部、前导和尾随约束来固定滚动视图。然后,由于我在运行时填充表格视图并且事先不知道它的高度,所以我在代码中设置了滚动视图的contentSize
:
[self.scrollView setContentSize:CGSizeMake(self.contentView.frame.size.width, self.tableView.frame.size.height)];
但我没有完成这项工作......我会错过什么?
【问题讨论】:
将您的约束添加到 UIView 中,其中子项是 UIScrollView。并且不设置ContentSize。 @Tanuj 我刚刚这样做了,但它似乎对我不起作用...... @AppsDev 你的问题解决了吗? 【参考方案1】:AppsDev,看看这个视频,它对我通过故事板做 UIScrollView 有很大帮助 https://www.youtube.com/watch?v=UnQsFlMGDsI
也永远不要设置 scrollView 的 contentSize,因为它必须由 scrollView 自己决定,这就是我们有 AutoLayout 的原因。
我相信我们应该有一个uiscrollview-autolayout
的标签
【讨论】:
【参考方案2】:不要手动设置内容大小。相反,
-
将
contentView
的四个边约束到scrollView
的边上。
将contentView
的宽度限制为等于scrollView
的宽度。 (这将防止内容比scrollView
更宽。)
将contentView
的顶部和侧面约束到子视图的相应边缘。
将contentView's
的侧面和底部约束到tableView
的侧面和底部。
现在棘手的地方在于:将子视图的底部限制为与表格视图的顶部相同。但是,除非您在子视图上显式设置高度约束,否则您将得到一个布局错误,即scrollView
的内容的高度将不明确。为了解决这个问题,您可以设置孩子的占位符高度以使 Interface Builder 满意,但是您还必须在运行时设置它的高度。
现在你应该准备好了。 scrollView
现在可以通过检查约束层次结构来计算其内容的完整高度和宽度,您不必手动设置其内容高度。
【讨论】:
【参考方案3】:我终于设法通过遵循@Sana 的答案和this post 来完成这项工作,以便能够滚动表格视图内容。
谢谢大家的回复。
【讨论】:
【参考方案4】:举例:
UIView *containerView = [[UIView alloc] init];
UIScrollView *scrollView = [[UIScrollView alloc] init];
[containerView addSubview:scrollView];
containerView.translatesAutoresizingMaskIntoConstraints = NO;
scrollView.translatesAutoresizingMaskIntoConstraints = NO;
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(containerView, scrollView);
[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView]|"
options:kNilOptions
metrics:nil
views:viewsDictionary]];
[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView]|"
options:kNilOptions
metrics:nil
views:viewsDictionary]];
【讨论】:
我已经在IB中设置了视图,我应该在代码中添加它们吗? 您将滚动视图作为子视图添加到 UIView。? 是的,我刚刚将滚动视图嵌入到另一个 UIView 中,并在 IB 中设置了它们之间的约束。 移除 UIScrollView 的所有约束,只需要 UIView 的约束即可。 查看此示例:github.com/jamieforrest/ScrollingButtons【参考方案5】:使用此代码我的代码可以帮助您。
-(void)viewDidLayoutSubviews
[super viewDidLayoutSubviews];
[self.scrollView setContentSize:CGSizeMake(self.contentView.frame.size.width, self.tableView.frame.size.height)];
【讨论】:
在使用自动布局时不应该使用 setContentSize。以上是关于如何使 UIScrollView 与自动布局和动态内容一起使用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用情节提要和自动布局在 UIScrollView 中添加动态高度/空间元素? [复制]
斯威夫特:我无法使自动布局约束适用于我的 UIScrollView
具有自动布局的 UIScrollView 中的动态大小的 UITableView