直接自定义UIView (CYPhotoPreviewer),为了实现双击缩放,可以实现UIScrollViewDelegate对应的方法。如果需要模糊背景,可以在自定义的UIView中先添加模糊背景,再添加UIScrollView,继而在UIScrollView中添加图片容器,这个容器就是要显示的图片的父视图,代码一目了然:
- (void)设置{ self.frame=[UIScreenmainScreen] .bounds; 自我。写成backgroundColor=[UIColorclearColor]; UITapGestureRecognizer * singleTap=[[UITapGestureRecognizeralloc] initWithTarget:作用:@ selector (singleTap:)]; (自我addGestureRecognizer: singleTap); UITapGestureRecognizer * doubleTap=[[UITapGestureRecognizeralloc] initWithTarget:作用:@ selector (doubleTap:)]; doubleTap。numberOfTapsRequired=2; [singleTaprequireGestureRecognizerToFail: doubleTap]; (自我addGestureRecognizer: doubleTap); UILongPressGestureRecognizer * longPress=[[UILongPressGestureRecognizeralloc] initWithTarget:作用:@ selector (longPress:)]; (自我addGestureRecognizer: longPress);//设置模糊背景 自我。blurBackground=[[UIVisualEffectViewalloc] initWithEffect: [UIBlurEffecteffectWithStyle: UIBlurEffectStyleExtraLight]]; self.blurBackground.frame=self.frame; (自我addSubview: self.blurBackground);//设置UIScrollView相关属性 自我。滚动视图=[[UIScrollViewalloc] initWithFrame: [UIScreenmainScreen] .bounds]; self.scrollView.delegate=自我; self.scrollView。bouncesZoom=是的; self.scrollView。maximumZoomScale=3.0; self.scrollView。multipleTouchEnabled=YES; self.scrollView。alwaysBounceVertical=没有; self.scrollView。showsVerticalScrollIndicator=没有; self.scrollView。showsHorizontalScrollIndicator=没有; (自我addSubview: self.scrollView);//containerView 自我。containerView=[[UIViewalloc] init); [self.scrollViewaddSubview: self.containerView];//imageView 自我。imageView=[[UIImageViewalloc] init); self.imageView。clipsToBounds=是的; self.imageView。写成backgroundColor=(αUIColorcolorWithWhite: 1.0: 0.5); [self.containerViewaddSubview: self.imageView]; }
可以看的到,我们给设置了模糊背景,给这个CYPhotoPreviewer添加了单击手势(关闭PhotoPreviewer),双击手势(缩放图片),长按手势(使用UIAlertController菜单,比如保存图片等)。
好,确定了这个CYPhotoPreviewer中的显示内容,那么我们该如何显示这个CYPhotoPreviewer呢?
-
<李>直接将这个CYPhotoPreviewer添加到keyWindow上李>
<李>将这个CYPhotoPreviewer添加到控制器的自我。视图上
李>
这两种方式的实现都差不多,不过如果使用第一种方式的话,会导致将CYPhotoPreviewer添加到keyWindow上之后,再长按继续将UIAlertController显示就比较麻烦了,因此,这里打算采用将CYPhotoPreviewer添加到控制器的<代码>自我。查看代码>上,继而就可以很方便的显示UIAlertController了:
- (void) previewFromImageView: (UIImageView *) fromImageViewinContainer:容器(UIView *) { _fromImageView=fromImageView; fromImageView。隐藏=是的; (containeraddSubview:自我);//将CYPhotoPreviewer添加到容器上 self.containerView。起源=CGPointZero; self.containerView。宽度=self.width;//containerView的宽度是屏幕的宽度 图像用户界面图像*=fromImageView.image;//计算containerView的高度 如果(image.size。高度/image.size。高度比;自我。高度/self.width) { self.containerView。身高=地板(image.size。高度/(image.size。宽/self.width)); 其他}{ CGFloatheight=image.size。高度/image.size。宽度* self.width; 如果高度自我。高,,self.containerView。高度——self.height
可以看的到,我们将外面的图片fromImageView传递进来,是为了显示更好的动画效果;将控制器的<代码>容器(自我。视图)代码>传递进来,是为了将CYPhotoPreviewer添加到容器的细节不需要在调用处处理,即初始化CYPhotoPreviewer之后,CYPhotoPreviewer就直接被容器添加为子视图了。动画很简单不再细说。
显示的效果已经做的好,单击关闭CYPhotoPreviewer也比较好实现,只需要从父类移除CYPhotoPreviewer即可:
- (void)驳回{ (延迟UIViewanimateWithDuration: 0.18: 0.0选项:UIViewAnimationOptionCurveEaseInOutanimations: ^ { CGRectfromRect=[self.fromImageViewconvertRect: self.fromImageView.boundstoView self.containerView):; self.imageView。内容模式=self.fromImageView.contentMode; self.imageView.frame=fromRect; self.blurBackground。α=0.01; }完成:^ (BOOL完成){ [UIViewanimateWithDuration: 0.10延迟:0选项:UIViewAnimationOptionCurveEaseInOutanimations: ^ { self.fromImageView.hidden=没有; 自我。α=0; }完成:^ (BOOL完成){ (自我removeFromSuperview); }); }); }iOS实现点击微信头像(放大,缩放,保存)效果