iOS实现点击微信头像(放大,缩放,保存)效果

  

  

 iOS实现点击微信头像(放大,缩放,保存)效果

  

  

直接自定义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实现点击微信头像(放大,缩放,保存)效果