iOS扫描二维码实现手势拉近拉远镜头
程序员文章站
2023-11-30 08:05:52
在做扫码需求,往往会有放大镜头需求。
苹果提供了avcaptureconnection中,videoscaleandcropfactor:缩放裁剪系数,使用该属性,...
在做扫码需求,往往会有放大镜头需求。
苹果提供了avcaptureconnection中,videoscaleandcropfactor:缩放裁剪系数,使用该属性,可以实现拉近拉远镜头。再结合手势uipinchgesturerecognizer,就很简单实现手势拉近拉远镜头。
手势代码
///记录开始的缩放比例 @property(nonatomic,assign)cgfloat begingesturescale; ///最后的缩放比例 @property(nonatomic,assign)cgfloat effectivescale; - (void)camerainitover { if (self.isvideozoom) { uipinchgesturerecognizer *pinch = [[uipinchgesturerecognizer alloc] initwithtarget:self action:@selector(pinchdetected:)]; pinch.delegate = self; [self.view addgesturerecognizer:pinch]; } } - (void)pinchdetected:(uipinchgesturerecognizer*)recogniser { self.effectivescale = self.begingesturescale * recogniser.scale; if (self.effectivescale < 1.0){ self.effectivescale = 1.0; } [self.scanobj setvideoscale:self.effectivescale]; } - (bool)gesturerecognizershouldbegin:(uigesturerecognizer *)gesturerecognizer { if ( [gesturerecognizer iskindofclass:[uipinchgesturerecognizer class]] ) { _begingesturescale = _effectivescale; } return yes; }
拉近拉远镜头代码
- (void)setvideoscale:(cgfloat)scale { [_input.device lockforconfiguration:nil]; avcaptureconnection *videoconnection = [self connectionwithmediatype:avmediatypevideo fromconnections:[[self stillimageoutput] connections]]; cgfloat maxscaleandcropfactor = ([[self.stillimageoutput connectionwithmediatype:avmediatypevideo] videomaxscaleandcropfactor])/16; if (scale > maxscaleandcropfactor) scale = maxscaleandcropfactor; cgfloat zoom = scale / videoconnection.videoscaleandcropfactor; videoconnection.videoscaleandcropfactor = scale; [_input.device unlockforconfiguration]; cgaffinetransform transform = _videopreview.transform; [catransaction begin]; [catransaction setanimationduration:.025]; _videopreview.transform = cgaffinetransformscale(transform, zoom, zoom); [catransaction commit]; }
有一点需要注意:the videoscaleandcropfactor property may be set to a value in the range of 1.0 to videomaxscaleandcropfactor,videoscaleandcropfactor这个属性取值范围是1.0-videomaxscaleandcropfactor,如果你设置超出范围会崩溃哦!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: .NET微信开发之PC 端微信扫码注册和登录功能实现
下一篇: vue组件三大核心概念图文详解