本文从最基础的scrollView控件写起,不断补充,直到非常复杂的实战演练。
一、scrollView基础
-
什么是UIScrollView?
一个UI控件滚动, 缩放 -
UIScrollView为什么要滚动? 滚动到哪里?
一个屏幕的范围内显示不全内容
内容最后结束的地方 -
什么在滚动?
scrollView的内容(scrollView的子view——contentView)在滚动
这里入一张图来说明:
- 滚动的时候是内容在滚动
- contentOffset是偏移量-->是框框(也就是scrollView的左上角原点的坐标)相对于内容(contentView的左上角原点)进行偏移。
- 当contentView的左上角原点和框框的原点重合时,偏移量为(0,0)
- 所以手指往下拖拽,偏移量y减小,contenView往下滚动,在框框中会慢慢往上显示内容
- 手指往左拖拽,偏移量x增大,conrentView往左移动,在框框中会慢 慢往右显示内容。
(这个偏移量可真是绕。。。。。。)
总之偏移量跟手势是相反的。往下y减少,往左x增大。(原来正常的应该是往下y增大,往左x减少)
其实还有一个属性:bounds 的x,y 其实就等于偏移量的x,y(因为都是框框的左上角原点相对于内容的左上角原点的坐标)
- 怎么添加scrollView?
- 实例化一个scrollView
- 向scrollView中添加子view
- 设置contentSize属性
- UIScrollView常用属性
滚动范围: contentSize --> 要比scrollView的size大
内边距: contentInset --> (滚动到边界的时候)imageView的边框距离scrollView边框的一个距离
偏移量: contentOffset --> 滚动到某一个位置(点)
弹簧效果: bounces --> 一般不关闭
总有弹簧效果 : 即使不设置 contentSize 也可以有弹簧效果 , 前提是:
bounces = YES
alwaysBounceVertical
alwaysBounceHorizontal
隐藏滚动指示器:
_scrollView.showsHorizontalScrollIndicator = NO;
_scrollView.showsVerticalScrollIndicator = NO;
设置是否可滚动:
scrollEnabled = YES;
-
ScrollView的size和contentSize的区别?
contentSize : 内容的滚动范围
scrollView.size : 本身的宽高 -
手动修改offset
修改offset的时候有动画效果
[_scrollView setContentOffset: animated:];
无法滚动的原因
-
contentSize小于scrollView的size
-
userInteractionEnabled = NO
-
_scrollView.scrollEnabled = NO; // 默认开启
-
监听scrollView的滚动
什么情况下会使用代理:
自己不能做
自己不适合来做 -
制定协议以及代理方法
-
定义一个代理属性
-
遵守协议
-
实现对应的代理方法
-
制定协议者在适当的时候调用代理方法
scrollView代理的使用:
-
遵守协议
-
设置成为代理
-
实现对应的方法
-
缩放实现
/**
minimumZoomScale; --> 最小的缩小倍数
maximumZoomScale; --> 最大的放大倍数
*/
_scrollView.minimumZoomScale = 0.3;
_scrollView.maximumZoomScale = 3;
// 实现代理方法, 告诉scrollView是那个view要进行缩放
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
二、scrollView实战
1. 轮播图
- 图片轮播器的pageControll
pageControll 主要属性:
numberOfPages
currentPage 0 .. numberOfPages - 1
设置非当前指示器的颜色
pageIndicatorTintColor
设置当前指示器颜色
currentPageIndicatorTintColor
- 自动播放
必要的定时器
/**
scheduled 计划,安排
interval : 间隔
target : 一般指控制器
selector: 方法
userInfo : 用户自定义的参数
repeats: 重复
每隔1秒钟 调用 控制器的 didClickButton: 方法, 传递的参数为nil
一旦创建就会立即生效
在使用timer的时候, 如果调用了 invalidate方法, 那么这个计时器就不 会再次生效
重新创建新的timer
*/
_timer = [NSTimer scheduledTimerWithTimeInterval:1
target:self
selector:@selector(didClickButton:)
userInfo:nil
repeats:YES];
[_time fire]; 立即执行, 不会等待 interval设置的时间
使用delegate:
修饰符必须使用weak, 防止循环引用
如果两个对象相互引用,其中必须有一个是 weak
pageEnabled = YES;
2. scrollView的自动布局
- masonry 纯代码布局
注意点:
-
给scrollView布局的时候,一定要保证添加到scrollView里的subview的宽高是可以确定的值。这样,scrollView的contentView才会根据subView的情况自动计算出来。
- 用storyboard给scrollView布局
参考链接:http://www.cocoachina.com/ios/20150104/10810.html
有非常详细的介绍。
步骤: - 上下左右添加约束
-
指定某个方向滚动时,添加一个中心点的约束
- 指定contentSize 的高度或者宽度。
- 如果需要修改,拉一根布局的线到控制器中。
网友评论