【问题标题】:How to make an UIScrollView work with Autolayout and dynamic content? [duplicate]如何使 UIScrollView 与自动布局和动态内容一起使用? [复制]
【发布时间】: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 你的问题解决了吗?

标签: ios uitableview uiscrollview autolayout


【解决方案1】:

AppsDev,看看这个视频,它对我通过故事板做 UIScrollView 有很大帮助 https://www.youtube.com/watch?v=UnQsFlMGDsI

也永远不要设置 scrollView 的 contentSize,因为它必须由 scrollView 自己决定,这就是我们有 AutoLayout 的原因。

我相信我们应该有一个uiscrollview-autolayout 的标签

【讨论】:

    【解决方案2】:

    不要手动设置内容大小。相反,

    1. 将contentView 的四个边约束到scrollView 的边上。
    2. 将contentView 的宽度限制为等于scrollView 的宽度。 (这将防止内容比scrollView 更宽。)
    3. 将contentView 的顶部和侧面约束到子视图的相应边缘。
    4. 将contentView's 的侧面和底部约束到tableView 的侧面和底部。
    5. 现在棘手的地方在于:将子视图的底部限制为与表格视图的顶部相同。但是,除非您在子视图上显式设置高度约束,否则您将得到一个布局错误,即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 的约束即可。
        【解决方案5】:

        使用此代码我的代码可以帮助您。

        -(void)viewDidLayoutSubviews
        {
            [super viewDidLayoutSubviews];
           [self.scrollView setContentSize:CGSizeMake(self.contentView.frame.size.width, self.tableView.frame.size.height)];
        }
        

        【讨论】:

        • 在使用自动布局时不应该使用 setContentSize。
        猜你喜欢
        • 2019-03-22
        • 1970-01-01
        • 2014-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多