带有一个 child 的 ScrollView 和 AutoLayout 不滚动

ScrollView with one child and AutoLayout not scrolling

我有一个 ViewController 设置如下:

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

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

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

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

我尝试了什么:

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

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

// 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] Content view's frame is: {{0, 0}, {343, 0}}

现在,当我什至尝试使用以下代码逐一浏览 Child 视图时:

    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] My view UILabel frame is: {{10, 20}, {323, 52.5}}

2015-05-24 01:59:38.696 NewsApp[20218:3145567] My view UIImageView frame is: {{10, 82.5}, {323, 0}}

2015-05-24 01:59:38.696 NewsApp[20218:3145567] My view UILabel frame is: {{10, 92.5}, {323, 507.5}}

约束:

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

2-ContentView:距水平位置 0 px,与 ScrollView 相同 "width"(还尝试从顶部添加约束 0px,还尝试从顶部和底部添加 0px)。

3 篇文章标题、图像视图、文章内容:水平 0 像素,垂直等间距,并相互放置)。

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

解决方法:在ContentView和ScrollView之间添加上下约束(Vertical为0)或任意固定数,在ContentView内部的最后一个元素和ContentView之间添加Bottom Contraint本身

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

您需要将滚动视图和内容视图固定到主视图的宽度和高度。然后在内容视图中,将每个元素的顶部和底部固定到视图并相互固定,以根据元素的高度定义内容高度(中间有一个小 space。)

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