UIScrollView 的三个属性
contentSize 设置滚动区域,只有设置了滚动区域才能够滚动contentOffset 设置滚动内容偏移,决定当前显示的内容contentInset 设置滚动外框的偏移UIScrollView 无法滚动原因
UIScrollView 设置弹簧效果 & 滚动指示器运行程序,会发现不会滚动,那么如何滚动呢?
探索头文件
NS_CLASS_AVAILABLE_IOS(2_0) @interface UIScrollView : UIView <NSCoding> /// The point at which the origin of the content view is offset from the origin of the scroll view. /// 内容视图原点(origin)所在的偏移位置,相对于 scroll view 的 origin,默认是 CGPointZero @property(nonatomic) CGPoint contentOffset; // default CGPointZero /// The size of the content view /// 内容视图的大小,默认是 CGSizeZero @property(nonatomic) CGSize contentSize; // default CGSizeZero /// The distance that the content view is inset from the enclosing scroll view. /// 内容视图围绕(enclosing) scroll view 的距离,默认值是 UIEdgeInsetsZero @property(nonatomic) UIEdgeInsets contentInset; // default UIEdgeInsetsZero. add additional scroll area around content 定义属性,方便后续代码演练 @property (nonatomic, weak) UIScrollView *scrollView; @property (nonatomic, weak) UIImageView *imageView; 在 setupUI 方法中使用成员变量记录局部变量 _scrollView = sv; _imageView = iv; 新建 demoScrollView 方法并在 viewDidLoad 方法中调用 - (void)viewDidLoad { [super viewDidLoad]; [self setupUI]; [self demoScrollView]; } #pragma mark - 演练 scrollview - (void)demoScrollView { }结论
设置了滚动视图的 contentSize 之后,滚动视图就能够滚动了
没有 contentSize,scrollView 就不知道要滚多远
单独设置 contentSize 的 width // contentSize 的 width 决定了水平方向能滚多远 _scrollView.contentSize = CGSizeMake(_imageView.bounds.size.width, 0); 单独设置 contentSize 的 height // contentSize 的 height 决定了垂直方向能滚多远 _scrollView.contentSize = CGSizeMake(0, _imageView.bounds.size.height);结论
scrollView 要滚动就必须设置了滚动视图的 contentSizecontentSize 的 width 决定了水平方向滚动距离contentSize 的 height 决定了垂直方向滚动距离 方法名重构 —— 快捷键 cmd + shift + e /// 演示 contentSize /// /// 结论: /// - scrollView 要滚动就必须设置了滚动视图的 contentSize /// - contentSize 的 width 决定了水平方向滚动距离 /// - contentSize 的 height 决定了垂直方向滚动距离 - (void)demoContentSize { // 1. 设置 contentSize // 让 scrollView 的 contentSize 等于 图像视图的大小 // 设置了滚动视图的 contentSize 之后,滚动视图就能够滚动了 _scrollView.contentSize = _imageView.bounds.size; // contentSize 的 width 决定了水平方向能滚多远 // _scrollView.contentSize = CGSizeMake(_imageView.bounds.size.width, 0); // contentSize 的 height 决定了垂直方向能滚多远 // _scrollView.contentSize = CGSizeMake(0, _imageView.bounds.size.height); }结论
scrollView 通过修改 contentOffset 调整内部视图的坐标位置,从而给用户产生一种视觉上的滚动的效果contentOffset 的值本质上就是 bounds 的原点(origin) 值,苹果在为了方便程序员的理解,增加了这个属性 文档释义:contentOffset:内容视图原点(origin)所在的偏移位置,相对于 scroll view 的 origin,默认是 CGPointZero
苹果头文件的特点:越是重要的属性和方法就越靠上
新建测试方法 /// 测试 offset 相关方法 - (void)testSetOffsetMethod { } 修改按钮监听方法 [btn addTarget:self action:@selector(testSetOffsetMethod) forControlEvents:UIControlEventTouchUpInside]; 实现方法,测试 setContentOffset:animated: 方法 /// 测试 offset 相关方法 - (void)testSetOffsetMethod { // 1. 测试 setContentOffset CGFloat x = arc4random_uniform(_imageView.bounds.size.width); CGFloat y = arc4random_uniform(_imageView.bounds.size.height); // 利用系统默认的动画效果,动画时长不能修改 [_scrollView setContentOffset:CGPointMake(x, y) animated:YES]; } 自定义动画效果 // 2> 自定义动画效果 [UIView animateWithDuration:1.0 delay:0 usingSpringWithDamping:0.8 initialSpringVelocity:0 options:0 animations:^{ _scrollView.contentOffset = CGPointMake(x, y); } completion:nil]; 新建方法 testScrollRectMethod - (void)testScrollRectMethod { // 传入当前完全可见区域,什么也不发生 [_scrollView scrollRectToVisible:_scrollView.bounds animated:YES]; } 随机区域 // 2> 随机区域 CGFloat x = arc4random_uniform(_imageView.bounds.size.width); CGFloat y = arc4random_uniform(_imageView.bounds.size.height); CGRect rect = CGRectMake(x, y, _scrollView.bounds.size.width, _scrollView.bounds.size.height); [_scrollView scrollRectToVisible:rect animated:YES];结论
scrollView 通过修改 contentInset 调整内部和边缘的偏移
设置边距之后,初始没有效果,需要拖拽一下才有效果
可以通过设置 contentOffset 调整初始位置
scrollView 与内容相关的三个属性示意图如下:
结论
scrollView 要滚动就必须设置了滚动视图的 contentSize
contentSize 的 width 决定了水平方向滚动距离contentSize 的 height 决定了垂直方向滚动距离scrollView 通过修改 contentOffset 调整内部视图的坐标位置,从而给用户产生一种视觉上的滚动的效果
contentOffset 的值本质上就是 bounds 的原点(origin) 值,苹果在为了方便程序员的理解,增加了这个属性scrollView 通过修改 contentInset 调整内部和边缘的偏移
设置边距之后,初始没有效果,需要拖拽一下才有效果可以通过设置 contentOffset 调整初始位置如果禁止滚动,弹簧效果同样失效
测试滚动指示器 // 3. 滚动指示器 // 1> 禁用垂直滚动指示器 _scrollView.showsVerticalScrollIndicator = NO; // 1> 禁用水平滚动指示器 _scrollView.showsHorizontalScrollIndicator = NO;查看视图层次结构会发现,禁用指示器之后,那两个 UIImageView 不见了
结论
苹果是用 imageView 实现的水平和垂直指示器