【问题标题】:ScrollView with one child and AutoLayout not scrolling具有一个孩子的 ScrollView 和 AutoLayout 不滚动
【发布时间】:2015-08-05 18:04:41
【问题描述】:

我有一个 ViewController 设置如下:

这是一个新闻应用,所以一切都是动态加载的, 一旦我完成将数据加载到文章标题、文章内容和图像视图(外部滚动视图)并不会真正滚动

我还检查了 ContentView 以获取它的大小(只是调试)它给出的高度:0px(这是我最初为它设置的高度)

我的背景是用于移动开发的 Android/Java,所以我将高度设置为 0,我不确定 android 中是否有类似“Wrap_Content”的内容(-1:以 android 的内部属性值为例)。

在所有方面,我都想找到一种方法让 ContentView 动态调整大小以包括其子视图的所有高度 + 间距。然后 Scroll View 会显示一个漂亮的 Scroll。

我尝试了什么:

1-将 ContentView 的高度设置为例如 (1000) -> 它使 ScrollView 正常滚动(但这样的神奇数字很糟糕)。

2-尝试了以下代码(一旦我将数据加载到子视图中)

// Given that the references of the UI elements in my ViewController are:
// scrollView and contentView
- (void)updateScroll{
    self.scrollView.translatesAutoresizingMaskIntoConstraints = NO;
    self.contentView.translatesAutoresizingMaskIntoConstraints = NO;

    // Iterate over SubViews of ContentView
    for (UIView* subView in self.contentView.subviews) {
        subView.translatesAutoresizingMaskIntoConstraints = NO;
    }
    [self.scrollView setContentSize:self.contentView.frame.size];
}

我用这个调试过:

NSLog(@"Content view's frame is: %@", NSStringFromCGRect(self.contentView.frame));

并且总是得到这个输出:

2015-05-24 00:30:36.123 NewsApp[18983:2738892] 内容视图的框架是:{{0, 0}, {343, 0}}

现在,当我什至尝试使用此代码一一浏览子视图时:

    for (UIView* v in self.contentView.subviews) {
        v.translatesAutoresizingMaskIntoConstraints = NO;
        totalHeight += v.frame.size.height;
        NSLog(@"My view %@ frame is: %@",v.class ,NSStringFromCGRect(v.frame));
    }

尺寸如下:(如您所见,ImageView 显示高度:0px)--> 毁了一切 :(

2015-05-24 01:59:38.696 NewsApp[20218:3145567] 我的视图 UILabel 框架是: {{10, 20}, {323, 52.5}}

2015-05-24 01:59:38.696 NewsApp[20218:3145567] 我的视图 UIImageView 框架是:{{10, 82.5}, {323, 0}}

2015-05-24 01:59:38.696 NewsApp[20218:3145567] 我的视图 UILabel 框架是:{{10, 92.5}、{323、507.5}}

约束

1-ScrollView: 0 px 从所有方向(水平和垂直)

2-ContentView:水平位置 0 px,与 ScrollView 相同的“宽度”(还尝试从顶部添加约束 0px,并尝试从顶部和底部添加 0px)。

3-Articles Title、Image View、Article Content:水平 0px,垂直等间距,并置于彼此下方)。

我的环境: 构建目标 iOS 8,XCode:v. 6.3,项目当然启用了 AutoLayout

解决方案:在ContentView和ScrollView之间添加上下约束(垂直为0)或任意固定数字,并在ContentView内部最后一个元素和ContentView本身之间添加底部约束

【问题讨论】:

    标签: ios objective-c uiscrollview autolayout


    【解决方案1】:

    你没有wrap-content int iOS .我建议定义ScrollView 的高度 你不需要让它有动态高度,因为你有一个滚动

    【讨论】:

    • 不,那真的很糟糕,那是一个新闻应用程序,有些文章只有 2-3 行内容和 1 行标题,并且没有图像,而有些则字面意思 (50-60内容行)(标题 1-3 行)和 1 张图片(甚至更多),固定内容的高度很糟糕,在我最初的测试中,它破坏了一些东西,而且看起来很丑,有巨大的白色可滚动空间用于短文章
    • 如果有类似的东西我会很好:获取 ContentView 的实际大小,因为它绝对不是日志中的 0px。 (实际大小我的意思是 Javascript 的实际高度与 css 的高度),然后将 ContentView 的高度设置为实际测量的高度。
    • 如果您在 textView 中使用了属性字符串,则可以计算文章字符串的实际高度。
    • 间距限制如何?如果有这么多视图?我必须计算所有孩子的身高,但是如何计算约束的呈现方式(我是 iOS 新手,所以如果你认为有一段代码有效,请发布它,我会测试它是否有效我会正确标记的工作)。
    【解决方案2】:

    您需要将滚动视图和内容视图固定到主视图的宽度和高度。然后在内容视图内部,将每个元素的顶部和底部固定到视图和彼此上,以根据元素的高度定义内容高度(之间留有小间距。)

    检查 所有 子视图是否在两个方向上垂直固定,并且有一系列连续的固定来定义 ContentView 的形状。您缺少从 ArticleContentView 到 ContentView 底部的底部约束。

    【讨论】:

    • 我已经为父级的所有方向上的间距设置了一个约束,这还不足以让宽度/高度动态扩展到容器的任何大小吗?
    • 如果将 ContentView 的高度设置为它的父级,那么它不总是屏幕高度,并且从不滚动吗?它必须扩展到屏幕高度之外,如果以这种方式固定,它就无法做到这一点。
    • 滚动视图实际上并没有扩展,它们滚动。所以滚动视图保持在屏幕尺寸,但 contentView 需要可扩展。
    • 我没有为我的问题中提到的 contentView 设置高度,我还尝试将顶部/底部位置约束设置为 0,但它没有工作
    • 看看我附上的屏幕截图 第二个约束块属于 ContentView,它只有水平间距和宽度
    猜你喜欢
    • 1970-01-01
    • 2021-07-24
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多