一个手机屏幕显示的内容是有限,当内容数据多,在可是View中就展示不完全,这时候就需要用到UIScrollView控件.UIScrollView会隐藏超出内容的部分,相当于UIScrollView默认设置了clipBounds为YES.
有时候,我们可能添加了UIScrollView控件,但是它无法滚动,原因可能有下面几个:
1.没有设置contentsize,或者设置的content size小于或者等于scrollView的尺寸;
2.设置scrollEnable = NO;
3.userinteractionEnable = NO;(这方法有别去上一个,这个是是否与用户交互)
上面说到的两种方法都可能造成不能滚动,那么到底他们的区别是什么?scrollEnable仅仅是不能滚动,其他事情依旧能够响应,而userinteractionEnable禁止任何交互事件.包括其子控件的所有交互事件都会被禁止.需要注意的一点,UIScrollView的frmae决定了可视范围,contentsize决定了内容滚动的范围,滚动式内容进行滚动,UIScrollView控件本身是不滚动的
UIScrollView的常见属性:
>bounces 弹簧效果
self.scrollViewbounces = NO;//去除弹簧效果
>alwaysBounceVertical alwaysBounceHorizontal
不管有没有contentSize,总是有弹簧效果
作用:用来做下拉刷新和上拉刷新的
>indicatorStyle
设置滚动条的颜色
>self.scorllView.subViews
查看UIScrollView中有多少个子控件
>contentOffSet
控制内容的滚动,也称为内容的偏移量
偏移量 = contentSize左上角 与 内容左上角的差值
UIScorllView的左上角 - contentSize左上角
设置滚动条的颜色
控制内容的滚动,也称为内容的偏移量
偏移量 = contentSize左上角 与 内容左上角的差值
UIScorllView的左上角 - contentSize左上角
>self.scrollViewbounces = NO;//去除弹簧效果
查看UIScrollView中有多少个子控件
设置内边距(增加额外的滚动区域)
>contentInset
设置内边距(增加额外的滚动区域)
不管有没有contentSize,总是有弹簧效果
作用:用来做下拉刷新和上拉刷新的
UIScrollView的delegate
代理的作用
监听器的作用,可以监听UIScrollView的各种事件(只要成为UIScrollView的代理,就能监听UIScrollView的行为)
当UIScrollView发生一系列行为时,就会告诉代理(滚动了、点击了、拖拽了)
代理的使用规律
代理一般是当前控制器对象
代理id类型,且必须是弱指针
代理协议格式
控件类名Delegate,比如:UIScrollViewDelegate,UITextFieldDelegate
代理方法
方法名一般以控件开头.比如UIScrollView的代理一般以scrollView开头
监听UIScrollView各种行为的三大步骤
设置scrollView的delegate(代理)为控制器对象
控制器要遵守协议UIScrollViewDelegate协议
控制器要实现UIScrollViewDelegate协议里面的方法
UIScrollView常见的代理方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
-(void)scrollViewWillEndDragging..
-(void)scrollViewDidEndDragging...
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
监听器的作用,可以监听UIScrollView的各种事件(只要成为UIScrollView的代理,就能监听UIScrollView的行为)
当UIScrollView发生一系列行为时,就会告诉代理(滚动了、点击了、拖拽了)
代理一般是当前控制器对象
代理id类型,且必须是弱指针
代理协议格式
控件类名Delegate,比如:UIScrollViewDelegate,UITextFieldDelegate
代理方法
方法名一般以控件开头.比如UIScrollView的代理一般以scrollView开头
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
-(void)scrollViewWillEndDragging..
-(void)scrollViewDidEndDragging...
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
scrollView的代理可以是任何类型的OC 对象
设置scrollView的delegate(代理)为控制器对象
控制器要遵守协议UIScrollViewDelegate协议
控制器要实现UIScrollViewDelegate协议里面的方法
代理的注意点
scrollView的代理可以是任何类型的OC 对象
代理一定是weak
利用UIScrollView实现分页
01-开启分页功能
往scrollView中添加五张图片
设置contentSize
开启分页功能
self.scrollView.pageEnable = YES;
分页的标准:以scrollView的尺寸为一页
02-设置pageControl(监听scrollView的滚动设置页码)
第一种:scrollView停止滚动改变页码
第二种:scrollView滚动过程中改变页码
往scrollView中添加五张图片
设置contentSize
开启分页功能
self.scrollView.pageEnable = YES;
分页的标准:以scrollView的尺寸为一页
03-设置定时器
注意事项
NSTimer是一次性的,要么持续工作,一旦停止工作就无法再次使用
存在的问题?
拖入UITextView,不断地拖拽框中的文字,定时器不工作了
原因:和线程相关,线程就是用来执行任务的,同一时间只能做一件事情
如何解决?
修改NSTimer在NSRunLoop中的模式:NSRunLoopCommonModes
主线程不管在处理什么操作,都会抽时间处理NSTimer
注意事项
NSTimer是一次性的,要么持续工作,一旦停止工作就无法再次使用
存在的问题?
拖入UITextView,不断地拖拽框中的文字,定时器不工作了
原因:和线程相关,线程就是用来执行任务的,同一时间只能做一件事情
如何解决?
修改NSTimer在NSRunLoop中的模式:NSRunLoopCommonModes
主线程不管在处理什么操作,都会抽时间处理NSTimer
第一种:scrollView停止滚动改变页码
第二种:scrollView滚动过程中改变页码
04-UIScrollView的分页-封装
自定义控件(XIB)
新建:PageView
新建XIB文件描述PageView
给子控件设置数据
设置图片
提供imageNames属性,在pageView中实现set方法
-拷贝原来的代码
-根据图片名数据创建对应的imageView
-设置scrollView的contentSize
-在awakeFromNib中设置pageControl
-设置pageView成为scrollView的代理
存在的问题?
内部的子控件不会跟随父控件伸缩(学完屏幕适配可以轻松解决)
多次传入新图片,出现叠加效果
解决?
让self.scrollView.subViews数组中的所有控件都执行removeFromSuperView方法
[self.scrollView.subViews makeObjectsPerformSelector:@selector(removeFromSuperView)];