uncategorized

UIScrollView的三个属性

最近在学IOS, 碰到一个经常会遇到的一个UI组件, UIScrollView这个组件有三个非
常重要的属性

* contentOffset (The point at which the origin of the content view is offset from the origin of the scroll view.)
* contentSize (The size of the content view.)
* contentInset (The distance that the content view is inset from the enclosing scroll view.)

在官网看这写属性的意义, 不太能理解, 自己实际写的简单的列子, 大概明白三者是怎
么回事了

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//
// ViewController.m
// Test
//
// Created by Adden on 11/22/15.
// Copyright © 2015 adden. All rights reserved.
//

#import "ViewController.h"

@interface ViewController () <UIScrollViewDelegate>

@property (strong, nonatomic) IBOutlet UIScrollView *scrollView;

@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];

// 新建一个UIScrollView, 它的frame为屏幕窗口大小
self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.view addSubview:self.scrollView];

self.scrollView.backgroundColor = [UIColor redColor];
self.scrollView.showsVerticalScrollIndicator = true;

self.scrollView.delegate = self;

// 设置它的contentInset距离top: 200, left: 20, bottom: 100, right: 0, 这里相当于html/css里面的padding
self.scrollView.contentInset = UIEdgeInsetsMake(200, 20, 100, 0);

// 设置它的contentSzie的width: 320 - 20 (因为, contentInset.left = 20, 为了让屏幕的宽可以全部显示), height: 1000 (为了可下拉拖动)
self.scrollView.contentSize = CGSizeMake(320 - 20, 1000);

// 向里面添加一个蓝色的按钮, 注意蓝色按钮的起始位置
UIButton *button = [[UIButton alloc] init];
button.frame = CGRectMake(0, 0, 100, 100);
button.backgroundColor = [UIColor blueColor];
button.titleLabel.text = @"张小张";
[self.scrollView addSubview:button];

// 向里面添加一个黄色的label, 注意label的位置
UILabel* label = [[UILabel alloc] init];
label.text = @"Label";
label.backgroundColor = [UIColor yellowColor];
// 在一个320 x 568 的屏幕上面无法显示全部, 因为我们把水平constentSize.width = 300, 就无法拖动了
label.frame = CGRectMake(self.scrollView.frame.size.width - 40, 0, 40, 40);
[self.scrollView addSubview:label];

// 在scrollView的最下面添加了一个label, 注意label的位置. 然后label的bottom距离scrollView底端的距离
UILabel* label2 = [[UILabel alloc] init];
label2.text = @"张小张";
label2.backgroundColor = [UIColor brownColor];
label2.frame = CGRectMake(0, 1000 - 40, 40, 40);
[self.scrollView addSubview:label2];

NSLog(@"self.scrollView.contentOffset.y = %f", self.scrollView.contentOffset.y);

}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

#pragma marke - UIScrollViewDelegate

//- (void)scrollViewDidScroll:(UIScrollView *)scrollView
//{
// NSLog(@"%f", scrollView.contentOffset.y);
//}

@end

下面是以上代码运行的效果图, 我加了一点备注

上面的效果图已经把contentSizecontentInset说的差不多了, 这里还差一个contentOffset
这个属性, 这个属性说的是contentSize的起始位置与scrollView这个View的frame的差
列如上面代码打印的self.scrollView.contentOffset.y

因为我们的contentInset.top = 200, 所以scrollView的内容开始位置与scrollView.frame
相差就是200了, 由于方向问题, 这里是-200

这基本上我对UIScrollView这三个属性的理解了, 因为UITableView, UITextView,
UICollectionView的子类, 这些都是常用的, 所以掌握非常关键.