热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

单击图片放大,浏览图片细节,之后再单击回到原始页面,如果在浏览细节时候,双击图片会局部放大,也可以双手拖拽放大

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

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

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



推荐阅读
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • C# WPF自定义按钮的方法
    本文介绍了在C# WPF中实现自定义按钮的方法,包括使用图片作为按钮背景、自定义鼠标进入效果、自定义按压效果和自定义禁用效果。通过创建CustomButton.cs类和ButtonStyles.xaml资源文件,设计按钮的Style并添加所需的依赖属性,可以实现自定义按钮的效果。示例代码在ButtonStyles.xaml中给出。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
author-avatar
mobiledu2502878307
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有