系统的 UIScrollView 就有多点触摸改变图片的大小的功能,如果在向添加别的触摸事件,如这次讲到的双击图片大小就可以自定义一个 scrollView,当然,这个 scrollView 是继承自系统的 UIScrollView 的,这样,它仍然具有系统 scrollView 的特性,另外,可以添加自己想要的特性。
新的 scrollView 只需要添加一个方法,就可以实现双击图片变大的功能
#import "ZYScrollView.h" @implementation ZYScrollView - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { } return self; } //触摸开始 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; if (touch.tapCount == 2) { CGFloat zoomScale = self.zoomScale; //若 scrollView 的缩放比例是 1.0 (图片是原来的大小,没有经过放大 )就放大图片,若图片已经处在放大的状态,就将图片的大小缩小到原来的大小 zoomScale = zoomScale == 1.0 ? 2.0 : 1.0; [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.5]; //改变缩放比例 self.zoomScale = zoomScale; // 通过改变缩放比例来改变图片的大小时,图片的起始坐标不会改变 [UIView commitAnimations]; } }
在 视图控制器类中
@implementation ZYViewController - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor blackColor]; //自定义类 双击可放大的scrollView ZYScrollView *scrollView = [[ZYScrollView alloc] initWithFrame:self.view.bounds]; //多点触控缩放 // UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds]; //添加内容 _imageView = [[UIImageView alloc] initWithFrame:self.view.bounds]; _imageView.image = [UIImage imageNamed:@"0.jpg"]; //一个标记用来决定一个视图在它自身边界改变时怎样布局它的内容 _imageView.contentMode = UIViewContentModeScaleAspectFit; [scrollView addSubview:_imageView]; //设置代理 scrollView.delegate = self; //设置内容视图的大小 scrollView.contentSize = CGSizeMake(320, 1000); //设置缩放最小比例 CGFloat类型 默认为1.0 scrollView.minimumZoomScale = 0.2; //设置缩放最大比例 CGFloat类型 默认为1.0 scrollView.maximumZoomScale = 2.0; //点击状态栏时scrollView是否滚动到顶部 默认为YES scrollView.scrollsToTop = YES; scrollView.bounces = NO; // 是否有弹射效果 [self.view addSubview:scrollView]; //设置 scrollView 当前的缩放比例 scrollView.zoomScale = 1.0; } #pragma mark - UIScrollViewDelegate 缩放常用四方法 //缩放过程中会一直调用 即只要 zoomScale 值改变就调用 - (void)scrollViewDidZoom:(UIScrollView *)scrollView { CGFloat scale = scrollView.zoomScale; CGRect zoomRect = CGRectZero; //获取内容视图缩放后的宽和高 zoomRect.size.width = scrollView.frame.size.width*scale; zoomRect.size.height = scrollView.frame.size.height*scale; //如果缩放比例小于1.0 即缩小 if (scale <= 1.0) { //让内容视图处在屏幕的中央 zoomRect.origin.x = scrollView.center.x - (zoomRect.size.width / 2.0); zoomRect.origin.y = scrollView.center.y - (zoomRect.size.height / 2.0); }
_imageView.frame = zoomRect; } //返回要缩放的UIView对象 如果return nil 什么都不发生 要执行多次 - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { return _imageView; } //在滚动视图开始缩放内容前调用 一次有效缩放 只执行一次 - (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view { NSLog(@"scrollViewWillBeginZooming---%@", view); } //当缩放结束后,并且在缩放大小回到min和max之间的弹射动画完成后 调用该方法 - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale { } @end