UIScrollView是一个能够在上下左右四个方向滚动的控件,UITableView、UICollectionView也是继承自UIScrollView。
UIScrollView用于显示超出屏幕大小的内容,一般需要配合其他控件来使用,如添加一个UIImageView子控件,可以用来显示更大的图片。UITableView、UICollectionView以及UITextView这些可以滑动显示更多内容的控件都是UIScrollView的子类。
UIScrollView在使用过程中有如下3个核心属性。
// contentSize:表示UIScrollView内容的尺寸(即可滚动区域),一般会大于屏幕大小
@property(nonatomic) CGSize contentSize; // 默认大小为0
// contentOffset:当前屏幕显示区域的原点(即左上角原点),在UIScrollView的位置
@property(nonatomic) CGPoint contentOffset; // 默认从原点开始
// contentInset:可以在UIScrollView内容的四周增加额外的滚动区域(设置的值为:上、左、下、右)
@property(nonatomic) UIEdgeInsets contentInset;
除此之外,UIScrollView还有以下几个常用的属性。
bounces:当UIScrollView滚动到边界时,再继续滚动会有个反弹的效果(通常设置为YES)。
// 注意:如果不设置contentSize,bounces的效果是显现不出来的,除非将alwaysBounceVertical和alwaysBounceHorizontal属性设置为YES。
showsHorizontalScrollIndicator:显示水平指示器(YES为显示)。
showsVerticalScrollIndicator:显示垂直指示器。
pagingEnabled:分页效果(是否整页翻动)。
scrollEnabled:UIScrollView是否可以滚动。
-(void)viewDidLoad {
[super viewDidLoad];
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image"]];
// 创建一个与屏幕等高等宽的滚动视图
UIScrollView *myScrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
// 设置滚动区域
myScrollView.contentSize = imageView.bounds.size;
// 其他属性
myScrollView.backgroundColor = [UIColor redColor];
myScrollView.contentOffset = CGPointMake(0, 2);
myScrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);
[myScrollView adSSubview:imageView];
[self.view addSubview:myScrollView];
}
2. UIScrollView常用代理方法的实现
UIScrollViewDelegate是UIScrollView的代理协议,通过其中定义的代理方法,即可监听在用户交互过程中的不同动作。在调用UIScrollViewDelegate中的方法前,需要提前将UIScrollView对象的代理设置完成,系统会在特定的时机自动调用代理对象的响应方法,即发送特定的消息给代理,代理来完成相应工作。
目前UIScrollView共有13个代理方法,但是在实际开发中并不会都用到,这里主要讲其中3个方法。
// 当滚动时不断调用。
-(void)scrollViewDidScroll:(UIScrollView *)scrollView;
// 即将开始滚动时调用。
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
// 手指离开屏幕,停止滚动时调用。
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;
UIScrollViewDelegate的实现方法与其他代理协议的实现方法是完全一致的,主要包括以下3个步骤。
遵守代理协议。谁遵守了这个协议,谁就是UIScrollView的代理,一般情况下,会设置控制器类作为滚动视图的代理。
设置代理属性。
根据程序功能的需要,实现相应的代理方法。
@interface ViewController() <UIScrollViewDelegate>
-(void)viewDidLoad {
[super viewDidLoad];
// ...
myScrollView.delegate = self;
// ...
}
-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
NSLog(@" 滚动调用 ");
}
3. 视图的缩放功能
UIScrollView提供了对子控件(如图片)的放大和缩小功能,该项功能需要通过UIScrollView的代理方法来实现。需要注意的是缩放功能会修改UIScrollView的contentSize值。
// UIScrollView中定义的与图片放大缩小相关的属性。
@property(nonatomic) CGFloat minimumZoomScale; // 最小放大比例,取值0.0-1.0。默认1.0
@property(nonatomic) CGFloat maximumZoomScale; // 最大放大比例。默认1.0
// UIScrollViewDelegate中定义的与图片放大缩小相关的代理方法。
// 返回需要放大的控件,必须实现改方法
-(nullable UIView *)viewForZoomInScrollView:(UIScrollView *)scrollVIew;
// 即将开始缩放时调用
-(void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view;
// 结束缩放时调用
-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view atScale:(CGFloat)scale;
// 缩放过程中不断调用该方法
-(void)scrollViewDidZoom:(UIScrollView *)scrollView;
添加一个用于缩放的UIImageView图片属性,并且对其进行懒加载设置属性。
@interface ViewController ()<UIScrollViewDelegate>
@property (nonatomic, strong) UIImageView *imageView;
@end
-(UIImageView *)imageView {
if (_imageView == nil) {
_imageView = [[UIImageView alloc] initWithIamge:[UIImage imageNamed:@"image"]];
}
return _imageView;
}
-(void)viewDidLoad {
// ...
myScrollView.delegate = self;
myScrollView.minimumZoomScale = 0.3;
myScrollView.maximumZoomScale = 3;
// ...
}
// 实现viewForZoomingInScrollView:方法,返回需要被缩放的图片对象。
-(void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view {
NSLog(@" 缩放开始 ");
}
// 监控用户缩放的行为动作。
-(UIView *)viewForZoomInScrollView:(UIScrollVIew *)scrollView {
return self.imageView;
}