自动布局+ UIScrollView和单个子视图

只是玩Auto Layout和UIScrollView。 我在这里错过了什么? 这将在屏幕底部显示一个蓝色的scrollView,但是我看不到contentView。 视图debugging器无话可说。 有任何想法吗?

// // ViewController.m // Fit // // Created by Adam Dahan on 2015-03-13. // Copyright (c) 2015 Adam Dahan. All rights reserved. // #import "ViewController.h" @interface ViewController () { UIScrollView *scrollView; UIView *contentView; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [self createViews]; [self constrainScrollView]; [self constrainContentView]; } - (void)createViews { #pragma Initialize a scrollView scrollView = [[UIScrollView alloc] initWithFrame:CGRectZero]; scrollView.translatesAutoresizingMaskIntoConstraints = NO; scrollView.backgroundColor = [UIColor blueColor]; scrollView.showsHorizontalScrollIndicator = NO; scrollView.showsVerticalScrollIndicator = NO; [self.view addSubview:scrollView]; #pragma Initialize a contentView for the scrollView contentView = [[UIView alloc] initWithFrame:CGRectZero]; contentView.backgroundColor = [UIColor redColor]; contentView.translatesAutoresizingMaskIntoConstraints = NO; [scrollView addSubview:contentView]; } - (void)constrainScrollView { #pragma scrollView vertical constraints NSArray *cns = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[scrollView(40)]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(scrollView)]; [self.view addConstraints:cns]; #pragma scrollView horizontal constraints cns = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(scrollView)]; [self.view addConstraints:cns]; } - (void)constrainContentView { #pragma contentView vertical constraints NSArray *cns = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(scrollView, contentView)]; [scrollView addConstraints:cns]; #pragma contentView horizontal constraints cns = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[contentView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(scrollView, contentView)]; [scrollView addConstraints:cns]; } @end 

使用自动布局时,ScrollViews会更复杂一些。 该框架是从其他视图的约束定义的(因为你会在constainScrollView方法中添加的)。

contentSize是根据scrollView的视图的约束来定义的。 对于你的情况,contentSize是(0,0),因为内部视图没有宽度或高度约束。

我想你会喜欢这个内部视图来填充滚动视图。 那么你的约束应该是这样的:

 - (void)constrainContentView { [self.view layoutIfNeeded]; // This causes the scrollview width and height to be calculated based on the constraints you sent in the previous method // You could check by adding a breakpoint here, if the scrollview has the frame you would expect #pragma contentView vertical constraints NSArray *cns = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[contentView(height)]-|" options:0 metrics:@{"height":@(CGRectGetHeight(scrollView.frame))} views:NSDictionaryOfVariableBindings(scrollView, contentView)]; [scrollView addConstraints:cns]; #pragma contentView horizontal constraints cns = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[contentView(width)]-|" options:0 metrics:@{"width":@(CGRectGetWidth(self.view.frame))} views:NSDictionaryOfVariableBindings(scrollView, contentView)]; [scrollView addConstraints:cns]; } 

您为widthheight设置的实际值取决于您的需要。

重要的是, scrollView内部的scrollView需要以这样的方式设置约束,以便contentSize可以被计算而没有歧义。 这意味着如果视图没有内在大小(如UIButtonUILabel ),则需要显式地添加宽度/高度约束。

由于明确地设置了宽度和高度,在方向更改上,您需要更新约束,以便内部视图具有正确的尺寸。

希望这可以解决你的问题。

你真的应该看看技术说明TN2154 UIScrollView和Autolayout 。

你的方式让系统不能决定scrollView的contentSize。

主要思想是让scrollView知道什么是contentSize,不pipe你select哪种方式。