YongSir

专业程序员伪装者

scrollView的一些经验(一)

scrollView的一些经验(一)

scrollView,默认不会滚动

因为:

1
2
var contentOffset: CGPoint // default CGPointZero
var contentSize: CGSize // default CGSizeZero

scrollView的layout

scrollView的layout,如果只设置其subViews为leading/trailing/top/bottom的话,是没有效果的也不会滚动,因为默认是没有contentSize的,如果想用纯sb的话,你需要制定一个确定大小的辅助性view(有width和height),只有这样才能自动计算contentSize,正如:

用 UIScrollView 和它 subview 的 leading/trailing/top/bottom 来互相决定大小的时候,会出现「Has ambiguous scrollable content width/height」的 warning正确的姿势是用 UIScrollView 外部的 view 或 UIScrollView 本身的 width/height 确定 subview 的尺寸,进而确定 contentSize。因为 UIScrollView 本身的 leading/trailing/top/bottom 变得不好用,所以我习惯的做法是在 UIScrollView 和它原来的 subviews 之间增加一个 content view。

其实官方对这些问题已做了说明:

设计scrollView的核心便是对于content 的scroll方式的展示,这就意味着content size是最重要的,而自己本身的bounds与content size没有任何关系。所以理论上,只要所加的约束能最终计算出content size就没有问题。

所以常常在scrollView中率先添加一个辅助性的contentView,然后再在辅助性的视图上添加下一层级的视图,对比衍生自scrollView的tableView和collectionView,我们甚至可以推断一条这样的结论:对于scrollView 的直接子试图最好只有一个!
官方的小demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
- (void)viewDidLoad {

UIScrollView *scrollView;
UIImageView *imageView;
NSDictionary *viewsDictionary;

// Create the scroll view and the image view.
scrollView = [[UIScrollView alloc] init];
imageView = [[UIImageView alloc] init];

// Add an image to the image view.
[imageView setImage:[UIImage imageNamed:"MyReallyBigImage"]];
// Add the scroll view to our view.
[self.view addSubview:scrollView];
// Add the image view to the scroll view.
[scrollView addSubview:imageView];

// Set the translatesAutoresizingMaskIntoConstraints to NO so that the views autoresizing mask is not translated into auto layout constraints.
scrollView.translatesAutoresizingMaskIntoConstraints = NO;
imageView.translatesAutoresizingMaskIntoConstraints = NO;

// Set the constraints for the scroll view and the image view.
viewsDictionary = NSDictionaryOfVariableBindings(scrollView, imageView);

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView]|" options:0 metrics: 0 views:viewsDictionary]];

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView]|" options:0 metrics: 0 views:viewsDictionary]];

[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[imageView]|" options:0 metrics: 0 views:viewsDictionary]];

[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[imageView]|" options:0 metrics: 0 views:viewsDictionary]];

/* the rest of your code here... */
}

猜测是:通过img给出了imgV的W和H,下一篇就用storyboard来试试