UIScrollView 的 contentView 的高度基于使用 Storyboard 的内部内容

Height of contentView of UIScrollView based on inside content using Storyboard

我实际上面临着仅使用 故事板约束 .

让我的 UIScrollView 完全响应的困难

这是我的层次结构:

> - UIViewController
>  - UIView
>   - UIScrollView
>    - contentView
>     - module1View
>     - module2View
>     - module3View

所有模块都是用来展示图表的。 我希望他们能够响应。我希望它们的宽度为屏幕的 100%,并且它们的高度由使用约束添加的 ratio 定义。这些模块彼此相邻显示,就像新闻源中的新闻一样。

我的问题是:如何设置 contentView 高度等于所有模块(模块 1 + 2 + 3)的总和?

换句话说我想实现:

  • Top of contentView = top of module 1
  • Top of module 2 = bottom of module 1
  • Top of module 2 = bottom of module 2
  • Bottom of contentView = bottom of module 3

为了做到这一点,我遵循了在互联网上找到的一些教程。以下是我遵循的步骤:

  1. 设置UIScrollView约束以定义其位置和位置
  2. 设置UIScrollView顶部底部左侧右间距0.
  3. 最近的邻居
  4. 将模块之间的约束设置为"stack"它们一个 其他.
  5. (我在这里被屏蔽了)contentView 的底部设置为 模块 3 的底部以允许 UIScrollview 滚动到最后 内容。

我试图强制 UIScrollView 的高度:它有效但没有响应。由于模组的高度是通过一个比例计算出来的,根据设备的不同,高度"module 1 + 2 + 3"会发生变化。

我尝试将模块 3 的约束添加到 contentView 以设置模块 3 的底部 = contentView 的底部。所有约束都变成红色,到处都是警告。

您知道如何根据响应式内容设置 contentView 的高度吗? (就像“以某种方式包装内容”)。

在此先感谢您的帮助!

尝试定义模块运行时的高度并以编程方式为模块添加自动布局约束。

 #define kDeviceHeight                   [UIScreen mainScreen].bounds.size.height
 #define kDeviceWidth                    [UIScreen mainScreen].bounds.size.width

    - (void)viewDidLoad {

        [super viewDidLoad];
        [self setScrollViewHeight];

    }

    -(void)setScrollViewHeight{

        float module1_Height,module2_Height,module3_Height;// Calculate the height of modules over here and assign it to respective variables
        float viewVerticalSpacing = 5; // Provides space between two views
        float YAxis = 0;
        module1View.frame = CGRectMake(0, 0, kDeviceWidth, module1_Height);

        YAxis = YAxis + module1_Height + viewVerticalSpacing;
        module2View.frame = CGRectMake(0, YAxis, kDeviceWidth, module2_Height);

        YAxis = YAxis + module2_Height + viewVerticalSpacing;
        module3View.frame = CGRectMake(0, YAxis, kDeviceWidth, module3_Height);

        float scrollView_height = YAxis + module3_Height + viewVerticalSpacing;
        scroll_view.contentSize = CGSizeMake(kDeviceWidth, scrollView_height);
        scroll_view.frame = CGRectMake(0, 0, kDeviceWidth, kDeviceHeight);
    }

我已经能够完全从情节提要中获得动态滚动视图,无需代码,步骤如下:

1) 在故事板中,添加一个滚动视图并将其边缘限制在主视图的边缘或以任何合适的方式

2) 在滚动视图中,添加一个普通的旧 UIView 作为容器。将其约束到滚动视图的所有 4 个边缘,但还要添加一个相对于滚动视图的 等宽 约束,以及一个 等高 约束滚动视图

3) 非常重要:为等高约束设置低优先级,例如250.

4) 在您在第 2 步中添加的容器视图中,添加您的 3 个模块。将第一个模块的顶部边缘约束到容器视图的顶部,将最后一个模块的底部边缘约束到容器视图的底部,并将所有中间模块约束到链中的前一个模块。这应该为您提供容器视图内的完整垂直约束链。您还需要为每个模块添加任何适当的 x 定位/宽度设置约束。

5) 构建并 运行!您的滚动视图内容大小应自动等于所有模块的总高度加上它们之间的间距,动态更改模块内容将通过自动布局更新滚动视图内容大小,而不需要显式代码来计算和更新。

对我来说,Daniel 的解决方案很有帮助,但并不奏效。 以下是更新后的步骤:

1) 在故事板中,添加一个滚动视图并将其边缘限制在主视图的边缘或以任何合适的方式

2) 在滚动视图中,添加一个普通的旧 UIView 作为容器。将其约束到滚动视图的所有 4 个边缘,但还添加相对于滚动视图的 parent(最高视图)的等宽约束,以及滚动的等高约束视图的 parent

3)非常重要:为等高约束设置低优先级,例如250.

我通过不将内容视图的高度设置为等于任何值来让我的工作正常。

对我来说,推荐的解决方案没有用。我不得不稍微修改一下:

  1. 执行推荐解决方案中的所有步骤。
  2. 将 ScrollView 的高度设置为 0 并将其设置为低优先级。
  3. 将 scrollView 父级的 bottom-space-constraint 设置为低优先级。

我认为我的解决方案只有在滚动视图的父视图不是根内容视图时才有效。