带有一个孩子的ScrollView和不滚动的AutoLayout

时间:2015-05-23 22:50:55

标签: ios objective-c uiscrollview autolayout

我有一个ViewController设置如下:

enter image description here

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

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

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

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

我尝试了什么:

将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 from all directions(Horiz。和Vert。)

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

3篇文章标题,图像视图,文章内容:0px水平,等间距垂直,并放置在彼此之下)。

我的环境: Build Target iOS 8,XCode:v.6.3,Project当然启用了AutoLayout

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

2 个答案:

答案 0 :(得分:2)

您需要将scrollview和contentview固定到主视图的宽度和高度。然后在内容视图中,将每个元素的顶部和底部固定到视图和彼此之间,以根据元素的高度定义内容高度(两者之间的间距很小。)

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

答案 1 :(得分:0)

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