iOS模仿微信长按识别二维码的多种方式

  

,参考:https://github.com/nglszs/BCQRcode

  

        # import & lt; UIKit/UIKit.h>   @ interface ViewController: ui   @end   **************   #进口“ViewController.h”   @ interface ViewController ()   @end   @ implementation ViewController   - (void) viewDidLoad {   (超级viewDidLoad);   自我。title=@”二维码”;   UIBarButtonItem * leftBtn=[[UIBarButtonItem alloc]   initWithTitle: @“生”成   风格:UIBarButtonItemStylePlain   目标:自我   行动:@ selector (backView)];   self.navigationItem。leftBarButtonItem=leftBtn;   UIBarButtonItem * rightBtn=[[UIBarButtonItem alloc]   initWithTitle: @”扫描”   风格:UIBarButtonItemStylePlain   目标:自我   行动:@ selector (ScanView)];   self.navigationItem。rightBarButtonItem=rightBtn;//长按识别图中的二维码,类似于微信里面的功能,前提是当前页面必须有二维码   UILongPressGestureRecognizer * longPress=[[UILongPressGestureRecognizer alloc] initWithTarget:自我行动:@ selector (readCode:)];   (自我。视图addGestureRecognizer longPress):;   }   - (void) readCode: (UILongPressGestureRecognizer *) pressSender {   如果(pressSender。状态==UIGestureRecognizerStateBegan) {//截图再读取   UIGraphicsBeginImageContextWithOptions (self.view.bounds。大小,是的,0);   CGContextRef上下文=UIGraphicsGetCurrentContext ();   (self。view。层renderInContext上下文):;   用户界面图像*图像=UIGraphicsGetImageFromCurrentImageContext ();   UIGraphicsEndImageContext ();//识别二维码   CIImage * CIImage=[[CIImage alloc] initWithCGImage:形象。CGImage选项:nil);   CIContext * CIContext=[CIContext contextWithOptions: @ {kCIContextUseSoftwareRenderer: @ (YES)});//软件渲染   CIDetector *探测器=[CIDetector detectorOfType: CIDetectorTypeQRCode上下文:ciContext选项:@ {CIDetectorAccuracy: CIDetectorAccuracyHigh});//二维码识别   NSArray *特性=[探测器featuresInImage ciImage):;   (CIQRCodeFeature *功能特性){   NSLog(@“味精=% @”feature.messageString);//打印二维码中的信息//对结果进行处理   ResultViewController * resultVC=[[ResultViewController alloc] init);   resultVC。contentString=feature.messageString;   (自我。导航控制器pushViewController: resultVC动画:没有);   }   }   }   - (void) backView {   UIImageView * codeImageView=[[UIImageView alloc] initWithFrame: CGRectMake ((BCWidth - 200)/2, 100, 200, 200));   codeImageView.layer。borderColor=[用户界面颜色orangeColor] .CGColor;   codeImageView.layer。borderWidth=1;   (自我。视图addSubview codeImageView):;//有图片的时候,也可以不设置圆角   [codeImageView creatCode: @“https://www.baidu.com”形象:[界面图像imageNamed: @“bg”] andImageCorner: 4];//没有图片的时候//[codeImageView creatCode: @”这波可以“形象:nil andImageCorner: 4];   }   - (void) ScanView {   (自我。导航控制器pushViewController (ScanCodeViewController新):动画:是的);   }   - (void) didReceiveMemoryWarning {   (超级didReceiveMemoryWarning);//处理任何资源都可以被重新创建。   }   @end   * * * * * * * * * * * *生成二维码   # import & lt; UIKit/UIKit.h>   @ interface UIImageView (CreatCode)/* *   这里传入二维码的信息,形象是加载二维码上方的图片,如果不要图片直接codeImage为零即可,后面是图片的圆角   */- (void) creatCode: (NSString *) codeContent形象:(用户界面图像*)codeImage andImageCorner: (CGFloat) imageCorner;   @end   **************   #进口“UIImageView + CreatCode.h”   #定义图象尺寸self.bounds.size.width   @ implementation UIImageView (CreatCode)   - (void) creatCode: (NSString *) codeContent形象:(用户界面图像*)codeImage andImageCorner: (CGFloat) imageCorner {//用CoreImage框架实现二维码的生成,下面方法最好异步调用   设置(dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)、^ {   CIFilter * codeFilter=[CIFilter filterWithName: @“CIQRCodeGenerator”);//每次调用都恢复其默认属性   [codeFilter setDefaults];   NSData * codeData=https://www.yisu.com/zixun/[codeContent dataUsingEncoding: NSUTF8StringEncoding);//设置滤镜数据   [codeFilter setValue: codeData forKey: @“inputMessage”);//获得滤镜输出的图片   CIImage * outputImage=[codeFilter outputImage];//这里的图像必须经过位图转换,不然会很模糊   用户界面图像* translateImage=[自我creatUIImageFromCIImage: outputImage andSize:图象尺寸);//这里如果不想设置圆角,直接传一个图片就好了   用户界面图像* resultImage=[自我setSuperImage: translateImage andSubImage:[自我imageCornerRadius: imageCorner andImage: codeImage]];   设置(dispatch_get_main_queue()、^ {   自我。形象=resultImage;   });   });   }//这里的尺寸我是用imageview的宽度来算的,你可以改为自己想要的大小   (用户界面图像*)creatUIImageFromCIImage:(CIImage *)图像andSize:大小(CGFloat) {//下面是创建bitmao没什么好解释的,不懂得自行百度或者参考官方文档   CGRect中程度上=CGRectIntegral (image.extent);   CGFloat规模=MIN(大?CGRectGetWidth(程度),大?CGRectGetHeight(程度);   size_t宽度=CGRectGetWidth(程度)*规模;   size_t高度=CGRectGetHeight(程度)*规模;   也就是说CGColorSpaceRef=CGColorSpaceCreateDeviceGray ();   CGContextRef contextRef=CGBitmapContextCreate (nil,宽度、高度8 0,也就是说,(CGBitmapInfo) kCGImageAlphaNone);   CIContext *上下文=[CIContext contextWithOptions nil):;   CGImageRef imageRef=(上下文createCGImage:图像fromRect:程度上);   CGContextSetInterpolationQuality (contextRef kCGInterpolationNone);   CGContextScaleCTM (contextRef、规模、规模);   CGContextDrawImage (contextRef程度,imageRef);   CGImageRef newImage=CGBitmapContextCreateImage (contextRef);   CGContextRelease (contextRef);   CGImageRelease (imageRef);   返回(用户界面图像imageWithCGImage newImage):;   }//这里将二维码上方的图片设置圆角并缩放   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

iOS模仿微信长按识别二维码的多种方式