单击图片放大,浏览图片细节,之后再单击回到原始页面,

如果在浏览细节时候,双击图片 会局部放大,也可以双手拖拽放大,

newImage.gif

代码参考

#import "TransImageTool.h"

#define kSCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)

#define kSCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height)

#define kMaxZoom 3

@interface TransImageTool ()

@property (nonatomic, assign) CGFloat width;

@property (nonatomic, assign) CGFloat height;

@property (nonatomic, assign) BOOL isTwiceTaping;

@property (nonatomic, assign) BOOL isDoubleTapingForZoom;

@property (nonatomic, assign) CGFloat currentScale;

@property (nonatomic, assign) CGFloat offsetY;

@property (nonatomic, assign) CGFloat touchX;

@property (nonatomic, assign) CGFloat touchY;

@property (nonatomic, strong) UIImageView *transImageView;

@property (nonatomic, strong) UIScrollView *scrollView;

@property (nonatomic, strong) UIView *backView;

@property (nonatomic, strong) UIButton *userBtn ;

@property (nonatomic, strong) UIView *userBtnContainer ;

@end

static CGRect oldframe;

@implementation TransImageTool

- (void)showImage:(UIImageView *)avatarImageView{

UIImage *image = avatarImageView.image;

UIWindow *window = [UIApplication sharedApplication].keyWindow;

oldframe = [avatarImageView convertRect:avatarImageView.bounds toView:window];

UIImageView *imageView = [[UIImageView alloc]initWithFrame:oldframe];

imageView.image = image;

self.transImageView = imageView;

UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, kSCREEN_WIDTH, kSCREEN_HEIGHT)];

scrollView.delegate = self;

scrollView.backgroundColor = [UIColor blackColor];

scrollView.maximumZoomScale = 5.0;

CGFloat ratio = _width / _height * kSCREEN_HEIGHT / kSCREEN_WIDTH;

CGFloat min = MIN(ratio, 1.0);

scrollView.minimumZoomScale = min;

self.scrollView = scrollView;

UITapGestureRecognizer *onetap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(hideImage:)];

[self.scrollView addGestureRecognizer:onetap];

[self.scrollView addSubview:imageView];

UITapGestureRecognizer *tapImgViewTwice = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapImgViewHandleTwice:)];

tapImgViewTwice.numberOfTapsRequired = 2;

tapImgViewTwice.numberOfTouchesRequired = 1;

[scrollView addGestureRecognizer:tapImgViewTwice];

//如果双击失败就单击

[onetap requireGestureRecognizerToFail:tapImgViewTwice];

[window addSubview:self.scrollView];

CGFloat imageViewX = 0;

CGFloat imageViewY = (kSCREEN_HEIGHT - image.size.height*kSCREEN_WIDTH/image.size.width) / 2;

CGFloat imageViewW = kSCREEN_WIDTH;

CGFloat imageViewH = image.size.height * kSCREEN_WIDTH/image.size.width;

[UIView animateWithDuration:0.3

animations:^

{

imageView.frame = CGRectMake(imageViewX, imageViewY, imageViewW, imageViewH);

}

completion:^(BOOL finished)

{

}];

}

- (void)hideImage:(UITapGestureRecognizer*)tap

{

UIView *backgroundView = tap.view;

self.userBtnContainer.alpha = 0;

[UIView animateWithDuration:0.3

animations:^

{

self.transImageView.frame = oldframe;

self.scrollView.alpha = 0;

}

completion:^(BOOL finished)

{

[backgroundView removeFromSuperview];

[self.scrollView removeFromSuperview];

[self.userBtnContainer removeFromSuperview];

}];

}

#pragma mark - UIScrollViewDelegate -

-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale

{

self.currentScale = scale;

}

-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{

return self.transImageView;

}

-(void)scrollViewDidZoom:(UIScrollView *)scrollView

{

CGFloat xcenter = scrollView.center.x;

CGFloat ycenter = scrollView.center.y;

xcenter = scrollView.contentSize.width > kSCREEN_WIDTH?scrollView.contentSize.width / 2 : xcenter;

ycenter = scrollView.contentSize.height > kSCREEN_HEIGHT ?scrollView.contentSize.height / 2 : ycenter;

if(_isDoubleTapingForZoom)//是否是双击放大的

{

if (_touchX>0 && _touchY>0)

{

//点击在图片上

CGFloat transformX = _touchX * kMaxZoom;

CGFloat transformY = _touchY * kMaxZoom;

CGFloat contentW = scrollView.contentSize.width;

CGFloat contentH = scrollView.contentSize.height;

if (transformX + kSCREEN_WIDTH *.5>=contentW)

{

//右边太大。

transformX = kSCREEN_WIDTH*(kMaxZoom-1);

}

else

{

if (transformX-kSCREEN_WIDTH *.5 < 0)

{//左边太小

transformX = 0;

}

else

{

transformX = transformX-kSCREEN_WIDTH *0.5;

}

}

//计算Y

//Y的放大比例跟图片的本身有关,需要从新计算内容的高度和屏幕的尺寸关系

int maxCount = contentH /([UIScreen mainScreen].bounds.size.height);

if (maxCount >= 1)

{

//智能移动到中心

if (transformY-contentH *0.5 < 0)

{

//上边太小,智能移动到边界

transformY = 0;

}

else

{

if (transformY +kSCREEN_HEIGHT *.5 > contentH) {

//下边太大,智能移动到边界

transformY = contentH - kSCREEN_HEIGHT;

}

else

{

transformY = transformY - kSCREEN_HEIGHT *.5;

}

}

}

else

{

if (transformY-contentH *0.5 < 0)

{

//上边太小,智能移动到边界

transformY = 0;

}

else

{

//下边太大,智能移动到边界

transformY = ycenter - kSCREEN_HEIGHT*0.5;

}

}

[scrollView setContentOffset:CGPointMake(transformX, transformY)];

}

else

{

//默认放大位置

[scrollView setContentOffset:CGPointMake(xcenter- kSCREEN_WIDTH *.5, ycenter - kSCREEN_HEIGHT*0.5)];

}

}

[self.transImageView setCenter:CGPointMake(xcenter, ycenter)];

_touchY = 0;

_touchX = 0;

}

-(void)tapImgViewHandleTwice:(UIGestureRecognizer *)sender{

_touchX = [sender locationInView:self.transImageView].x;

_touchY = [sender locationInView:self.transImageView].y;

if (_touchY >CGRectGetHeight(self.transImageView.frame))

{

//如果大于最大的就是在图片外面,默认放大

_touchY = 0;

}

if(_isTwiceTaping)//双击

{

return;

}

_isTwiceTaping = YES;

if(_currentScale > 1.0)

{

_currentScale = 1.0;

[_scrollView setZoomScale:1.0 animated:YES];

}

else

{

_isDoubleTapingForZoom = YES;

_currentScale = kMaxZoom;

[_scrollView setZoomScale:kMaxZoom animated:YES];

}

_isDoubleTapingForZoom = NO;

//延时做标记判断,使用户点击3次时的单击效果不生效。

[self performSelector:@selector(twiceTaping) withObject:nil afterDelay:0.65];

}

-(void)twiceTaping{

_isTwiceTaping = NO;

}

//是否添加其他按钮

- (void)addTooBtnView

{

UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(0, 20, kSCREEN_WIDTH, 80)];

containerView.backgroundColor = [UIColor clearColor];

self.userBtnContainer = containerView;

// [window addSubview:containerView];

/*添加button*/

UIButton *userBtnright = [UIButton buttonWithType:UIButtonTypeSystem];

userBtnright.frame =CGRectMake(kSCREEN_WIDTH - 100, 0, 60, 30);

[userBtnright setTitle:@"正确" forState:UIControlStateNormal];

[userBtnright setBackgroundColor:[UIColor blueColor]];

self.userBtn = userBtnright;

//[containerView addSubview:userBtnright];

/*添加button*/

UIButton *userBtnerror = [UIButton buttonWithType:UIButtonTypeSystem];

userBtnerror.frame =CGRectMake(kSCREEN_WIDTH - 170, 0, 60, 30);

[userBtnerror setTitle:@"错误" forState:UIControlStateNormal];

[userBtnerror setBackgroundColor:[UIColor blueColor]];

self.userBtn = userBtnerror;

//[containerView addSubview:userBtnerror];

}

-(void)dealloc

{

NSLog(@"dealloc");

}

@end

微信电脑端双击不能放大图片怎么回事_IOS 微信 聊天双击放大图片操作相关推荐

  1. 微信电脑端多开操作 要开多少台就有多少台(电脑小白都会)

    微信电脑端多开操作 要开多少台就有多少台 [电脑小白都会] 步骤一 步骤二 步骤三 步骤四 步骤五 步骤一 在桌面找到微信图标 步骤二 复制下面红色圈圈的路径 步骤三 在桌面新建一个txt文件,把刚刚 ...

  2. 微信电脑端-退出的群、删除的人,仍然可以查找或看到问题的解决方法

    微信电脑端-退出的群.删除的人,仍然可以查找或看到问题的解决方法 我们经常会发现退了的群,还一打关键字会弹出来候选,即使清空聊天记录也不行.这是由于本地缓存了旧数据导致的. 电脑端解决办法: 1. 退 ...

  3. 微信电脑端程序多账号登录

    很多人可能因为工作的缘故,有多个微信号.有时候一台电脑上需要登陆多个账号,同时在线聊天.只不过可惜的是,微信电脑版是不支持多开的,这给很多小伙伴带来了一些困扰. 系统迷在上次已经给大家分享了微信破解版 ...

  4. android微信朋友圈视频无法播放,微信朋友圈不能分享手机视频怎么回事?微信朋友圈大视频功能安卓不能用吗?...

    微信朋友圈不能分享手机视频怎么回事?微信朋友圈大视频功能安卓不能用吗?最近微信更新,用户可以进行分享自己手机里的视频,这一举措受到很多人的喜欢.那么微信朋友圈不能分享手机视频怎么回事?微信朋友圈大视频 ...

  5. 怎么用计算机要微信,电脑端要实现“微信双开”功能,三种方法,简单实用!...

    在我们的日常生活中,微信它已经不仅仅是一个聊天工具了,我们的许多工作很多时候也离不开它. 有时我们想把生活和工作分开,很多人都有两个微信号,一个工作号一个生活号:工作号用于工作日的业务,生活号用于日常 ...

  6. 微信电脑端【多开问题】+附赠,解决桌面图标变小白块问题

    由于工作原因拥有几个微信号扩展业务,但是总不能备好几个手机把,也不能开好多模拟器会很麻烦,于是乎~,弄了一段多开代码,大大便捷了工作需求. 如上的 微信多开.bat 点击这个小logo就可以多开了!! ...

  7. 用计算机编程做微信,电脑端微信双开,教你两种简单的方法,上手即用!

    这种方法简单粗暴,可以实现多开,但是多开的数量不容易控制. 首先我们选中桌面上的任一图标(文件或者程序),然后按住回车键,同时鼠标双击微信图标,双击以后仍需一直按着回车键. 打开今日头条,查看更多精彩 ...

  8. 苹果微信多开_简易版!微信电脑端多开方法!!!

    点击上方"GitHub指南",星标公众号优秀文章,第一时间送达hello,大家好,这里是GitHub指南.有点好奇大家有几个微信号?不少小伙伴应该都有两个甚至多个微信号吧,为了避免 ...

  9. python操作微信电脑版_Python使用itchat模块实现简单的微信控制电脑功能示例

    本文实例讲述了Python使用itchat模块实现简单的微信控制电脑功能.分享给大家供大家参考,具体如下: #!/usr/bin/python #coding=UTF-8 import request ...

最新文章

  1. java远程线程注入_系统权限远程线程注入到Explorer.exe
  2. 不用一行代码,用 API 操作数据库,你信吗
  3. python性能分析工具模块_python——关于Python Profilers性能分析器
  4. .NET Core加解密实战系列之——消息摘要与数字签名算法
  5. 矢量合成和分解的法则_专题14 运动的合成与分解
  6. Hello World!!!
  7. 泉州海事学校计算机,泉州海事学校寝室图片、校园环境好吗?
  8. 企业销售管理现状分析与解决思路(转)
  9. Palo Alto Networks 升级Traps高级终端防护产品 提升终端安全防护水平
  10. 聊聊加拿大的工作和生活
  11. 紫书刷题记录 UVa12100 打印队列
  12. python的语言是开源的_python语音识别 开源_DaCiDian是一个开源的中文普通话词汇,用于自动语音识别(ASR)....
  13. win7回收站右键没有清空回收站选项
  14. 第十部分 项目风险管理
  15. p5727深基5.例3冰雹猜想c语言,深基
  16. 天数智芯亮相2019世界人工智能大会 软硬协同深耕AI极致算力
  17. html5 可拖动悬浮按钮,前端vue开发:可移动的悬浮按钮的应用
  18. 加密艺术,当AI遇上区块链 |Mixlab跨学科
  19. 深度学习中端到端(end-to-end)简要理解
  20. DBA呢?我的数据库又双叒叕连不上了!

热门文章

  1. VPS融合怪测评脚本(主体已完善,历史遗留问题解决时间未知)(VPS fusion monster evaluation script)
  2. 推荐几款实用的思维导图工具
  3. 轻量应用服务器 饥荒,饥荒服务端世界设置生成
  4. golang开发环境之Sublime Text 2+GoSublime+gocode+MarGo
  5. httpclient的两个重要的参数maxPerRoute及MaxTotal
  6. 随机的UserAgent对付某反爬虫网站
  7. VR/AR的需求和前景
  8. Prometheus(二)基础概念
  9. 基于ug的框架断路器抽屉座运动仿真
  10. 1.4 Kronecker积