二维码生成扫瞄_欧洲虾米的博客-程序员宅基地

技术标签: 扫描  二维码  

二维码

加库:coremedia corevido ,quartcore. avf. libicon
Privacy - Camera Usage Description

#import “ViewController.h”
#import “libqrencode/QRCodeGenerator.h”
#import “ZBarSDK/Headers/ZBarSDK/ZBarSDK.h”

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *inputTF;
@property (weak, nonatomic) IBOutlet UILabel *resultLabel;
@property (weak, nonatomic) IBOutlet UIImageView *resultImgView;
@property(nonatomic,strong)UIView *overLayView; // 扫描框视图
// 生成二维码图片

  • (IBAction)toBeQRCodeImg:(id)sender;
    // 扫描二维码图片
  • (IBAction)scanQRCodeImg:(id)sender;

@end

@implementation ViewController

-(UIView *)overLayView {
if (!_overLayView) {
_overLayView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
CGFloat scrW = [UIScreen mainScreen].bounds.size.width;
CGFloat scrH = [UIScreen mainScreen].bounds.size.height;
_overLayView.center = CGPointMake(scrW / 2, scrH / 2);

    _overLayView.backgroundColor = [UIColor clearColor];
    
    _overLayView.layer.borderWidth = 1.0;
    _overLayView.layer.borderColor = [UIColor greenColor].CGColor;
    
    // 扫描线
    UIView *scannerLine = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 1.0)];
    scannerLine.backgroundColor = [UIColor greenColor];
    [_overLayView addSubview:scannerLine];
    
    // 定时器,让扫描线动起来
    [NSTimer scheduledTimerWithTimeInterval:0.088 repeats:YES block:^(NSTimer * _Nonnull timer) {
        
        // 获取扫描线的y值
        CGFloat y = scannerLine.frame.origin.y;
        if (y < 200) {
            y += 10;
            scannerLine.frame = CGRectMake(0, y, 200, 1.0);
        }
        else {
            y = 0;
            scannerLine.frame = CGRectMake(0, y, 200, 1.0);
        }
    }];
}
return _overLayView;

}

  • (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    }

  • (IBAction)toBeQRCodeImg:(id)sender {
    if (self.inputTF.text.length == 0) {
    NSLog(@“文本不可为空!”);
    return;
    }

    // 获取二维码图片
    UIImage *img = [QRCodeGenerator qrImageForString:self.inputTF.text imageSize:self.resultImgView.frame.size.width];

    // 将二维码图片显示在图形视图上
    self.resultImgView.image = img;
    }

/// 扫描二维码按钮触发方法

  • (IBAction)scanQRCodeImg:(id)sender {
    // 实例化一个扫描二维码控制器
    ZBarReaderViewController *readVC = [[ZBarReaderViewController alloc] init];
    // 设置摄像头上面的扫描框视图
    readVC.cameraOverlayView = self.overLayView;

    // 设置代理
    readVC.readerDelegate = self;
    // 获取控制器中已经实例好的扫描器对象
    ZBarImageScanner *scanner = readVC.scanner;
    // 设置扫描器识别的图片的类型为二维码类型
    [scanner setSymbology:ZBAR_I25 config:ZBAR_CFG_ENABLE to:0];
    // 跳转到扫描控制器
    [self presentViewController:readVC animated:YES completion:nil];
    }

#pragma mark -

  • (void) readerControllerDidFailToRead: (ZBarReaderController*) reader
    withRetry: (BOOL) retry {
    // 让扫描控制器消失
    [reader dismissViewControllerAnimated:YES completion:nil];
    NSLog(@“扫描二维码失败”);
    }

// 获取到扫描信息后回调的方法

  • (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey, id> *)info {
    // (1) 扫描控制器消失
    [picker dismissViewControllerAnimated:YES completion:nil];

    // (2) 获取扫描到的二维码图片数据
    UIImage *img = [info objectForKey:UIImagePickerControllerOriginalImage];
    // 显示在图形视图上
    self.resultImgView.image = img;

    // (3)提取二维码图片中的信息
    // <1> 获取信息数据枚举
    id results = [info objectForKey:ZBarReaderControllerResults];
    // <2>遍历枚举
    ZBarSymbol *symbol = nil;

    for (symbol in results) {
    break;
    }

    if (symbol == nil) {
    NSLog(@“扫描失败”);
    return;
    }
    // <3>获取扫描得到的信息
    NSString *resultString = symbol.data;

    // (4) 将得到的字符串显示在标签上
    self.resultLabel.text = resultString;

    // 如果是网址样式的字符串,做App跳转
    if ([resultString hasPrefix:@“http://”] || [resultString hasPrefix:@“https://”]) {

      NSURL *url = [NSURL URLWithString:resultString];
      [[UIApplication sharedApplication] openURL:url options:nil completionHandler:nil];
    

    }
    }

// 用户取消回调的方法

  • (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {

    [picker dismissViewControllerAnimated:YES completion:nil];
    NSLog(@“用户取消”);
    }

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44492756/article/details/86568332

智能推荐

热修复实现原理浅析_dev晴天的博客-程序员宅基地_热修复原理

一、热修复框架主要有三种核心技术1、代码修复2、资源修复3、动态库连接修复二、各种框架总结对比表开发中可根据自己app项目情况合理选择,并不是谁的功能多选择谁的。比如我们需要bug修改后即时生效可以选择阿里的AndFix。不需要即时生效,又需要更强大的功能时可以选择腾讯的Tinker。三、Instant Runinstant run的出现推动了热修复的发展1、介绍Instant Run 是安卓Studio2.0 新增的一个功能(As3.5+后变成了setting-&gt;hot s

看机器的字长 linux,命令行查看Linux的系统版本和内核版本以及机器字长_游苏昱的博客-程序员宅基地

查看Linux版本1. lsb_release -a (适用于所有linux)复制代码代码如下:LSB Version: :base-4.0-ia32:base-4.0-noarch:core-4.0-ia32:core-4.0-noarch:graphics-4.0-ia32:graphics-4.0-noarch:printing-4.0-ia32:printing-4.0-n...

jenkins 服务(分布式master+slave) 搭建_lxlmycsdnfree的博客-程序员宅基地

整体步骤如下: copy一些基础软件mkdir -p /opt/CIPackage/cd /usrscp -r [email protected]:/usr/java ./cd /usr/localscp -r [email protected]:/usr/local/sonar ./cd /optscp -r [email protected]:/

python3安装最新pip-Linux下快速安装Python3和pip_weixin_39942492的博客-程序员宅基地

比如yum!!!!!不要动现有的python2环境!一、安装python3.61. 安装依赖环境# yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel1# w...

ldd not a dynamic executable__kerneler的博客-程序员宅基地

ldd 是我们经常贯用的检测 PE文件依赖的好工具.可是今天我发现这了么个问题. 我用 ldd 看我的程序时却输出not a dynamic executable其实原因很简单就是我的程序是x64的. 而我把这个x64的程序放到了x32的机器上,用ldd看就是这种效果.反过来 32位的app 在用64位机器也不行查看系统版本 :file /bin/bash其实我们也可以使用 另外一命令来看readelf -d 你的程序 | grep NEEDED[[email protected] ~]# read

【转】Epoll模型_桂成林的博客-程序员宅基地

Linux 2.6内核中提高网络I/O性能的新方法-epoll I/O多路复用技术在比较多的TCP网络服务器中有使用,即比较多的用到select函数。1、为什么select落后    首先,在Linux内核中,select所用到的FD_SET是有限的,即内核中有个参数__FD_SETSIZE定义了每个FD_SET的句柄个数,在我用的2.6.15-25-386内核中,该值是1024,搜索

随便推点

运筹理论与案例实现01: 包含分段线性约束的优化问题(Python+Cplex版本)_运筹码仓的博客-程序员宅基地_分段约束

以运输问题为例,研究非线性成本运输成本下的优化模型,以及基于Cpex+Python的代码事先

You have new mail in /var/spool/mail/root解决方法?_chenyanlong_v的博客-程序员宅基地

解决方法:1:echo "unset MAILCHECK"&gt;&gt; /etc/profile2:source /etc/profile3:ls -lth /var/spool/mail/4:清空cat /dev/null &gt; /var/spool/mail/root...

OpenShift 4.5 新特性 - 创建任务和定时任务_dawnsky.liu的博客-程序员宅基地

文章目录通过YAML创建创建Job创建CronJob使用命令创建Job创建CronJob在Kubernetes中分贝使用Job和CronJob实现一次性运行的任务和定时运行的的任务,他们分别被Kubernetes的JobController和CronJobController控制器所控制,而这些任务都是通过Pod运行的。在创建Job和CronJob对象的时候,既可以使用定义对象的YAML文件,还可使用命令直接创建。需要注意的是,从OpenShift 4.5开始,在使用oc命令创建Job和CronJob对

(大数据工程师学习路径)第五步 MySQL参考手册中文版----MySQL语句语法_weixin_30699955的博客-程序员宅基地

一、数据定义语言1.1 ALTER DATABASE语法ALTER {DATABASE | SCHEMA} [db_name] alter_specification [, alter_specification] ...alter_specification: [DEFAULT] CHARACTER SET charset_name | [DEFAULT...

阿里热修复之Sophix的集成详解_weixin_34077371的博客-程序员宅基地

前言这几天开始接触热修复,体验了一把阿里热修复Sophix的傻瓜式接入。虽说是傻瓜式接入,但实际操作起来还是遇到不少坑,而且Sophix的官方文档有些地方有点难理解,部分图片也跟现在的不一样,所以今天我整理了一下我接入Sophix的过程,希望对大家有所帮助。当然,如果你对热修复并不了解,可以先去了解下Android的热修复,再来看这个文章。一、Sophix是什么Sophix提供了一套更加完美...

推荐文章

热门文章

相关标签