UIScrollView是UIKit框架下的很重要的视图类,是UIView的子类。UILabel,UIImageView,UIWebView分别用于展示文字,图片,网页,UILabel通过属性text来展示文字,UIImageView通过属性image来展示图片,UIWebView通过loadRequest:来展示网页(当然展示方法不止这些),UIScrollView虽然是这些视图类的兄弟类,但是并没有这些属性或者方法。但是根据UIView的层级关系,UIScrollView可以用来展示其他视图类,只需要把其他视图类的对象通过addSubview:方法加到UIScrollView的对象上就可以。

  所以得出结论:UIScrollView用来展示其他视图类的对象,如UIImageView,UILabel的对象。

  什么时候使用UIScrollView?如果只是展示一张普通的图片,没必要用UIScrollView来展示。从名字上看,UIScrollView是滚动视图的意思,就是需要滚动的时候才会用到。什么时候需要滚动,拿图片来说,就是一张图片本身的尺寸要大于滚动视图的尺寸,不能一次性全部展示出来。或者多张图片需要连续展示在滚动视图上同一位置,我们可以把这些图片合在一起形成一张超过滚动视图尺寸的大图片,然后让它实现滚动就可以了。

  所以,UIScrollView主要用于三个方面:一是展示一张超出滚动视图尺寸的图片。二是多张需要连续滚动的图片。三是一张图片实现缩放的效果。(事实上在实际开发中大多数情况UIScrollView都是用来展示图片,或者说是展示UIImageView的实例化对象)。

  UIScrollView也是可以设置代理的视图类,可以在滚动的不同状态通过相应的代理方法来处理相应的业务逻辑。其中,无论是滚动一张还是多张图片,本质是一样的,都是拖动,滚动,所以代理方法是一样的。重要的有四个。一张图片缩放有自己独有的代理方法,重要的也有四个而且必须实现其中一个。

0:准备工作

  首先准备三个UIScrollView的属性

 @property (nonatomic, strong) UIScrollView * scrollView1;//用于滚动一张图片
@property (nonatomic, strong) UIScrollView * scrollView2;//用于滚动多张图片
@property (nonatomic, strong) UIScrollView * scrollView3;//用于缩放一张图片

1:一张图片的滚动

  实现一张图片的滚动基本就三步:一是实例化UIScrollView和UIImageView并把imageView添加到scrollView上。二是设置必须设置的属性contentSize滚动范围。三是把scrollView添加到父视图上。有这三步就可以实现一个滚动视图。其他的属性可以根据业务需要设置,代理也是根据需要来设置。

  注意:

    实例化UIScrollView的时候frame不是所有图片加一起的frame,而是你想给用户展示到屏幕上的大小。就好像有一长串图片,通过UIScrollView这个屏幕上的窗口来展示,只是默认展示了整个图片的一部分,其他部分的展现需要用户来配合拖动或滑动。

 /**
* 1:一张超过scrollView尺寸图片的滚动(其实是imageView)
*/
- (void)scrollOneImage
{
//1:实例化scrollView和UIImageView,并把imageView添加到scrollView上面
//准备一张大尺寸图片,并把它放在imageView上,且要注意,如果图片尺寸太大,可能不显示
UIImage * image = [UIImage imageNamed:@"apple3"];
UIImageView * imageView = [[UIImageView alloc] initWithImage:image];
self.scrollView1 = [[UIScrollView alloc] initWithFrame:CGRectMake(, , self.view.frame.size.width, )];//scrollView本身还是那么大,通过属性设置一共的滚动范围
[self.scrollView1 addSubview:imageView]; //2:设置必须设置的属性
self.scrollView1.contentSize = imageView.bounds.size;//滚动范围,和图片的尺寸一样 //3:把imageView添加到scrollView上,把scrollView添加到self.view上
[self.view addSubview:self.scrollView1]; //0:可选设置的属性
self.scrollView1.scrollEnabled = YES;//默认为YES,如果要暂时关闭拖动,可以设置为NO
self.scrollView1.contentOffset = CGPointZero;//偏移量,默认为0
self.scrollView1.showsHorizontalScrollIndicator = NO;//水平滚动条,默认打开
self.scrollView1.showsVerticalScrollIndicator = NO;//竖直滚动条,默认打开
self.scrollView1.bounces = NO;//设置是否回弹,默认是YES
//0:如果需要可以设置代理
self.scrollView1.delegate = self; }

2:多张图片的滚动

  实现多张图片的滚动跟实现一张图片的滚动很类似,只是多了一个必须实现的属性而已。也是三步:一是实例化UIScrollView和UIImageView并把imageView添加到scrollView上。二是设置必须设置的属性contentSize和pageEnable,一个是滚动范围,另一个是是否翻页,如果想一张一张展示的话,这两个属性必须设置,其他可以根据需要选择。三是把scrollView添加到父视图上。

  注意:

    1:当图片比较多的时候,最好使用for循环来创建,比较简单。使用for循环创建的时候注意添加到父视图scrollView的时候要放在for循环里面。

    2:pageEnable属性默认是NO,如果设置为YES,则会在有视图边界的地方停下来,比如我们设置的5张图片,每一张图片都有自己的边界,想要每次都向用户展示一张完整的图片,这个属性就必须设置,不然,就会把5张图片当成一张图片处理,停在哪完全靠用户滑动的力度了。这就跟第一种情况完全一样了。所以滚动一张图片和多张图片就差这一个属性。

    3:关于那两个滚动条,如果不需要最好关掉,apple在封装的时候把这两个条当成scrollView的子视图处理了,不关有时候就会出现问题,具体在第三种用法缩放图片的时候有所展现。    

 /**
* 2:多张图片的滚动
*/
- (void)scrollManyImages
{
//1:实例化scrollView和UIImageView,并把imageView添加到scrollView上面
//注意scrollView的frame,就是展示给用户的大小。可以理解为一个窗口,后面有很多imageView待展示。
self.scrollView2 = [[UIScrollView alloc] initWithFrame:CGRectMake(, , self.view.frame.size.width, self.view.frame.size.height - )];
for (int i = ; i <= ; i++) {
NSString * imageName = [NSString stringWithFormat:@"scrollView%d.jpg", i];
UIImage * image = [UIImage imageNamed:imageName];
UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake((i - ) * self.view.frame.size.width, , self.view.frame.size.width, self.view.frame.size.height - )];
imageView.image = image;
[self.scrollView2 addSubview:imageView];
} //2:设置必须设置的属性
self.scrollView2.contentSize = CGSizeMake(self.view.frame.size.width * , );//滚动范围
//pagingEnabled属性意义是如果设置为YES,则在一个视图的边界或者倍数的时候会停下来,如果不设置,它就会把5张图片当成一张处理,停在哪看你滚动的力度。
self.scrollView2.pagingEnabled = YES; //3:父视图来添加
[self.view addSubview:self.scrollView2]; //0:最好关掉的属性
self.scrollView2.showsHorizontalScrollIndicator = NO;
self.scrollView2.showsVerticalScrollIndicator = NO;
//0:如果需要可以设置代理
self.scrollView2.delegate = self; }

3:一张图片的缩放

  实现一张图片的缩放跟上面实现滚动类似,只是多了一步,必须通过代理方法来实现,分为四步:一是实例化UIScrollView和UIImageView并把UIImageView添加到UIScrollView上。二是设置必须设置的属性maximumZoomScale和minimumZoomScale(两个至少设置一个),一个是最大缩放比例,一个是最小缩放比例,这两个属性默认值都是1.0,不缩放,如果不设置这两个属性,图片大小就没法改变,也就不会执行协议方法,缩放也就无从谈起。三是设置代理,并实现代理方法viewForZoomingInScrollView:,这个方法返回值就是要缩放的视图。四是把scrollView添加到父视图上。

 /**
* 3:缩放一张图片
*/
- (void)scaleOneImage
{
//1:实例化scrollView和UIImageView,并把imageView添加到scrollView上面
UIImage * image = [UIImage imageNamed:@"headImage"];//准备一张图片
UIImageView * imageView = [[UIImageView alloc] initWithImage:image];
self.scrollView3 = [[UIScrollView alloc] initWithFrame:CGRectMake(, , , )];
[self.scrollView3 addSubview:imageView]; //2:设置必须设置的属性
self.scrollView3.maximumZoomScale = ;
self.scrollView3.minimumZoomScale = 0.5; //3:设置代理
self.scrollView3.delegate = self; //4:添加
[self.view addSubview:self.scrollView3]; //0:如果代理中那么使用,这两个必须关掉
self.scrollView3.showsHorizontalScrollIndicator = NO;
self.scrollView3.showsVerticalScrollIndicator = NO;//这两个必须关掉,不然它是scrollView的子视图
}

遵守协议

 @interface ViewController () <UIScrollViewDelegate>

实现协议方法

 /**
* 当在scrollView的子view上使用捏合手势时,会自动调用这个方法
*
* @param scrollView 如果有多个scrollView,这个参数就是在哪个scrollView上进行操作
*
* @return 返回的就是要缩放的那张图片(imageView)
*/
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
return self.scrollView3.subviews.lastObject;
}

4:协议方法

  UIScrollView的协议UIScrollViewDelegate里面的方法可谓十分丰富,基本涵盖了滚动过程中的各种状态,可以根据需要来调用。协议方法分为两大类。一类是滚动的时候的协议方法(1,2两种情况),一类是缩放图片的协议方法(第3种情况)。第三种实现缩放有一个必须实现的方法(是实现缩放功能必须实现,并不是遵守协议必须实现,这些协议方法都是可选的),还有就是缩放的各个状态。

  注意:

    1:如果一个视图控制器中同时有第一和第二两种滚动视图,都会调用这几个协议方法,那么可以根据协议方法中带的参数scrollView作出判断。

    2:第三种里面第一个方法对于要实现缩放效果来说是必须实现的,但是并不是遵守协议必须实现的,UIScrollViewDelegate里面的方法都是可选的(optional)。

    3:只要不设置maximumZoomScale和minimumZoomScale这两个属性(默认都是1.0不缩放),那么第三种情况的协议方法就不会执行。

 #pragma mark - UIScrollVIewDelegate

 //1:第一种用法和第二种用法的代理方法,实现一张图片的拖动,或者多张图片的滚动(本质一样)

 //将要开始拖动调用
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
NSLog(@"willBeginDrag");
}
//拖动过程中调用
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
NSLog(@"didScroll");
}
//将要结束拖动时调用
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{
NSLog(@"willEndDrag");
}
//已经结束拖动时调用
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
NSLog(@"didEndDrag");
} //2:第三种用法的代理方法:实现图片的放大缩小 /**
* 当在scrollView的子view上使用捏合手势时,会自动调用这个方法
*
* @param scrollView 如果有多个scrollView,这个参数就是在哪个scrollView上进行操作
*
* @return 返回的就是要缩放的那张图片(imageView)
*/
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
return self.scrollView3.subviews.lastObject;
} /**
开始缩放的时候调用此方法
*/
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view
{
NSLog(@"willBeginZooming");
}
/**
缩放过程中调用此方法
*/
- (void)scrollViewDidZoom:(UIScrollView *)scrollView
{
NSLog(@"didZoom");
} /**
结束缩放的时候调用此方法
*/
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale
{
NSLog(@"didEndZooming");
}

UI基础视图----UIScrollView总结的更多相关文章

  1. UI基础视图----UIWebView总结

    UIWebView是UIKit框架中继承于UIView的一个常用的基础视图,和UILabel,UIImageView是兄弟类,用于展示一个网页. UIWebView是一个可以设置代理的类,在加载的不同 ...

  2. UI基础视图----UIView总结

    UIView是UIKit框架里面最基础的视图类,是UIResponder的子类,是UIApplication和UIViewController的兄弟类,是UIWindow,UILabel,UIImag ...

  3. IOS开发UI基础之UIScrollView

    什么是UIScrollView ● 移动设备的屏幕⼤大⼩小是极其有限的,因此直接展⽰示在⽤用户眼前的内容也相当有限 ● 当展⽰示的内容较多,超出⼀一个屏幕时,⽤用户可通过滚动⼿手势来查看屏幕以外的内容 ...

  4. IOS开发-UI基础-视图

    //------------------------------UIWindow--------------------------// 1.UIWindow:是 UIView 的子类,用于管理.协调 ...

  5. UI基础视图----UIImageView总结

    UIImageView和UILabel一样,也是UIKit框架中非常常用的视图类.继承关系和UILabel完全一致(都是继承于UIView),功能也相似(用户交互都默认为关,主要用于展示),只不过UI ...

  6. UI基础视图----UILabel总结

    UILabel是UIKit框架中非常常用的视图类,是UIView的子类,是UIWindow,UIImageView等的兄弟类,因为继承自UIView,所以继承了UIView中的属性和方法,大部分都可以 ...

  7. IOS UI 滚动视图 UIScrollView

    UIScrollView 常用属性 scrollView.maximumZoomScale= 2.0; //  缩放最大比例 scrollView.minimumZoomScale = 0.2;// ...

  8. UI基础:视图控制器.屏幕旋转.MVC 分类: iOS学习-UI 2015-07-02 22:21 62人阅读 评论(0) 收藏

    UIViewController 视图控制器,继承自UIResponder,作用:管理视图并且响应事件 功能: 1.分担APPdelegate的工作 2.实现模块独立,能提高复用性 创建UIViewC ...

  9. iOS开发UI基础—手写控件,frame,center和bounds属性

    iOS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...

随机推荐

  1. 关于javascript中setTimeout()和clearTimeout()的疑惑。

    由于在w3school中学习javascript时,当学到setTimeout()和clearTimeout()方法时.根据它所提供的例子(下面的代码转自w3cschool)—计数程序,发现当你不停的 ...

  2. Android 虚拟机快捷键

    何须这样麻烦,直接用快捷键就行了,你用鼠标点来点去怎么还不如用快捷键来得快:一下是快捷键: Home键(小房子键) 在键盘上映射的就是home键,这倒是很好记. Menu键 用于打开菜单的按键,在键盘 ...

  3. 解决jQuery中美元符号($)命名与别的js脚本库引用冲突方法

    在Jquery中,$是JQuery的别名,所有使用$的地方也都可以使用JQuery来替换,如$('#msg')等同于JQuery('#msg') 的写法.然而,当我们引入多个js库后,在另外一个js库 ...

  4. Javascript 开发IDE

    俗话说,工欲行其事,必先利其器.开发的时候有一款好的IDE,对开发效率的提升是非常帮助的,在此强烈推荐Webstorm,官网网址http://www.jetbrains.com/webstorm/ 主 ...

  5. windows下配置lamp环境(2)---配置Apache服务器2.2.25

    配置Apache 配置Apache时,先要找到安装目录中的主配置文httpd.conf,使用文本编辑器打开,最好不要使用windows自带的编辑器,可以使用NotePad++, vim,或者subli ...

  6. mysql日志文件相关的配置【2】

    1.二进制日志是什么? mysql 的二进制日志用于记录数据库上做的变更. 2.二进制日志什么时间写到磁盘 1.总的来说二进制日志会在释放锁之前就写入磁盘.也就是说在commit完成之前:client ...

  7. 汉诺塔问题C++实现

    大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 以下进行汉诺塔问题的递归实现 #include <iostream.h> int gb ...

  8. 字符串处理(正则表达式、NSScanner扫描、CoreParse解析器)-备用

    搜索 在一个字符串中搜索子字符串 最灵活的方法 1 - (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptio ...

  9. 另一种root方法,Android boot.img破解

    一.破解原理 Android手机获得Root权限,其实就是让/system和/data分区获得读写的权限.这两个分区的权限配置,一般在根分区的init.rc文件中,修改这个文件可永久获得root权限. ...

  10. FJ省队集训DAY1 T1

    题意:有一堆兔子,还有一个r为半径的圆,要求找到最大集合满足这个集合里的兔子两两连边的直线不经过圆. 思路:发现如果有两个点之间连边不经过圆,那么他们到圆的切线会构成一段区间,那么这两个点的区间一定会 ...