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

标签 ios objective-c uiscrollview autolayout

我有一个 ViewController 设置如下:

enter image description here

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

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

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

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

我尝试过的:

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

2-尝试了以下代码(一旦我完成将数据加载到 subview 中)

// 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}}

现在,当我什至尝试使用这段代码一个一个地浏览 subview 时:

    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 相同(还尝试从顶部添加约束 0px,还尝试从顶部和底部添加 0px)。

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

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

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

最佳答案

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

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

关于ios - 带有一个 child 的 ScrollView 和 AutoLayout 不滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30418328/

相关文章:

objective-c - 在 Objective-c 中使用 Static

iphone - 如何在 iOS 5 上以横向模式显示视频?

ios - 从较大的 UIImage 中裁剪一部分 UIImage,并包括非图像部分

弹出键盘时 iOS 11 无限滚动

ios - iOS8 在搜索栏中输入文本时出现错误

ios - 无法将应用程序提交到 AppStore : ERROR ITMS-90534: "Invalid Toolchain

iOS:如何在使用 UIViewContentModeScaleAspectFill 时对齐(左/右)UIImageView?

ios - 是否可以通过编程方式确定 iOS 目标

iphone - 分页uiscrollview自动滚动到第一页

ios - 如何在 Swift 中实现非常准确的计时?