iOS—仿微信单击放大图片
Posted YuFly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS—仿微信单击放大图片相关的知识,希望对你有一定的参考价值。
// // ImageZoomView.h // 手势缩放图片 // // Created by strong on 16/4/7. // Copyright ? 2016年 LYX. All rights reserved. // #import <UIKit/UIKit.h> @interface ImageZoomView : UIView - (instancetype)initWithFrame:(CGRect)frame andWithImage:(UIImageView *)imageview; @end
// // ImageZoomView.m // 手势缩放图片 // // Created by strong on 16/4/7. // Copyright ? 2016年 LYX. All rights reserved. // #import "ImageZoomView.h" static CGRect oldframe; @interface ImageZoomView ()<UIScrollViewDelegate> @end @implementation ImageZoomView{ UIScrollView *holderView; UIImageView *showImgView; BOOL isFirst; } - (instancetype)initWithFrame:(CGRect)frame andWithImage:(UIImageView *)imageview{ if(self = [super initWithFrame:frame]){ UIImage *image=imageview.image; holderView = [[UIScrollView alloc]initWithFrame:frame]; holderView.backgroundColor=[UIColor blackColor]; holderView.showsHorizontalScrollIndicator = NO; //水平 holderView.showsVerticalScrollIndicator = NO; // 竖直 holderView.scrollEnabled=YES; holderView.directionalLockEnabled = NO; holderView.bounces=NO; holderView.delegate=self; holderView.autoresizesSubviews=YES; holderView.maximumZoomScale=4; holderView.minimumZoomScale=1; [holderView setZoomScale:0.5 animated:NO]; UIWindow *window = [UIApplication sharedApplication].keyWindow; oldframe = [imageview convertRect:imageview.bounds toView:window]; [holderView setBackgroundColor:[UIColor colorWithRed:0/255.0 green:0/255.0 blue:0/255.0 alpha:1.0]]; //此时视图不会显示 [holderView setAlpha:0]; //将所展示的imageView重新绘制 showImgView = [[UIImageView alloc] initWithFrame:oldframe]; [showImgView setImage:imageview.image]; [showImgView setTag:0]; [holderView addSubview:showImgView]; [self addSubview:holderView]; //动画放大所展示的ImageView [UIView animateWithDuration:0.4 animations:^{ CGFloat y,width,height; y = ([UIScreen mainScreen].bounds.size.height - image.size.height * [UIScreen mainScreen].bounds.size.width / image.size.width) * 0.5; //宽度为屏幕宽度 width = [UIScreen mainScreen].bounds.size.width; //高度 根据图片宽高比设置 height = image.size.height * [UIScreen mainScreen].bounds.size.width / image.size.width; [showImgView setFrame:CGRectMake(0, y, width, height)]; //重要! 将视图显示出来 [holderView setAlpha:1]; } completion:^(BOOL finished) { }]; UITapGestureRecognizer *doubleTapGesture =[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)]; [doubleTapGesture setNumberOfTapsRequired:2]; [holderView addGestureRecognizer:doubleTapGesture]; [self addSubview:holderView]; UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(singleTap:)]; [singleTapGestureRecognizer setNumberOfTapsRequired:1]; [holderView addGestureRecognizer:singleTapGestureRecognizer]; [singleTapGestureRecognizer requireGestureRecognizerToFail:doubleTapGesture]; } return self; } - (void)scrollViewDidZoom:(UIScrollView *)scrollView{ CGFloat offsetX = (scrollView.bounds.size.width > scrollView.contentSize.width)? (scrollView.bounds.size.width - scrollView.contentSize.width) * 0.5 : 0.0; CGFloat offsetY = (scrollView.bounds.size.height > scrollView.contentSize.height)? (scrollView.bounds.size.height - scrollView.contentSize.height) * 0.5 : 0.0; showImgView.center = CGPointMake(scrollView.contentSize.width * 0.5 + offsetX, scrollView.contentSize.height * 0.5 + offsetY); } -(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { return showImgView; } - (void)handleDoubleTap:(UIGestureRecognizer *)gesture{ if(!isFirst){ isFirst=YES; CGPoint pointInView = [gesture locationInView:holderView]; CGFloat newZoomScale = holderView.zoomScale * 4.0f; newZoomScale = MIN(newZoomScale, holderView.maximumZoomScale); CGSize scrollViewSize =holderView.bounds.size; CGFloat w = scrollViewSize.width / newZoomScale; CGFloat h = scrollViewSize.height / newZoomScale; CGFloat x = pointInView.x - (w / 2.0f); CGFloat y = pointInView.y - (h / 2.0f); CGRect rectToZoomTo = CGRectMake(x, y, w, h); [holderView zoomToRect:rectToZoomTo animated:YES]; }else{ isFirst=NO; CGFloat newZoomScale = holderView.zoomScale / 4.0f; newZoomScale = MAX(newZoomScale, holderView.minimumZoomScale); [holderView setZoomScale:newZoomScale animated:YES]; } } - (void)singleTap:(UITapGestureRecognizer*)tap{ [UIView animateWithDuration:0.4 animations:^{ [showImgView setFrame:oldframe]; [holderView setAlpha:0]; } completion:^(BOOL finished) { //完成后操作->将背景视图删掉 [holderView removeFromSuperview]; [self removeFromSuperview]; }]; } @end
//点击事件 ImageZoomView *img=[[ImageZoomView alloc]initWithFrame:CGRectMake(0, 0, WIDTH_SCREEN, HEIGHT_SCREEN) andWithImage:imgView]; //当前视图 UIWindow *window = [UIApplication sharedApplication].keyWindow; [window addSubview:img];
以上是关于iOS—仿微信单击放大图片的主要内容,如果未能解决你的问题,请参考以下文章
Android 实现仿微信朋友圈九宫格图片+NineGridView+ImageWatcher(图片查看:1.预览,2.拖动,3.放大,4.左右滑动,5.长按保存到手机)的功能
腾讯大牛动态教学:Android 仿微信 QQ 图片裁剪,赶紧收藏起来!
Kotlin 实现仿微信图片选择器(增删(长按无拖动))+RecyclerView+BaseQuickAdapter(官网github)的功能