如何使 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

具有自动布局的 UIScrollView 中的动态大小的 UITableView

包含动态 TableView 高度的 UIScrollView 的自动布局

在自动布局中动态更改 UIScrollView 的大小