Demo地址:http://download.csdn.net/detail/u012881779/7977507
ZBar是一个开源库,用于扫描、读取二维码和条形码。支持的二维码包括:EAN/UPC,QR等。可以扫描含有链接的二维码,并且读取到结果后直接跳转到对应的链接。
- // 二维码扫描
- #import <UIKit/UIKit.h>
- @interface WXQrCodeScanning : UIViewController
- @property (weak, nonatomic) IBOutlet UIImageView *imageview; //边框
- @property (weak, nonatomic) IBOutlet UILabel *labelAlert;//提示
- @property (weak, nonatomic) IBOutlet UIButton *cancelBut; //取消
- //扫描
- - (void)QRscan;
- @end
- #import "WXQrCodeScanning.h"
- #import "ZBarSDK.h"
- #import "QRCodeGenerator.h"
- #import "SZNGTipView.h"
- @interface WXQrCodeScanning ()<ZBarReaderDelegate,UIAlertViewDelegate,UIWebViewDelegate>
- @property (strong, nonatomic) SZWaitView *waitV; //等待页面
- @property (strong, nonatomic) UIWebView *webView; //二维码跳转页面
- @property (strong, nonatomic) NSString *urlStr; //链接
- @property (strong, nonatomic) ZBarReaderViewController *reader;
- @end
- @implementation WXQrCodeScanning
- @synthesize imageview = _imageview;
- @synthesize waitV = _waitV;
- @synthesize webView = _webView;
- @synthesize urlStr = _urlStr;
- @synthesize reader = _reader;
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- }
- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
- {
- return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
- }
- //扫描
- /*扫描二维码部分:
- 导入ZBarSDK文件并引入一下框架
- AVFoundation.framework
- CoreMedia.framework
- CoreVideo.framework
- QuartzCore.framework
- libiconv.dylib
- 引入头文件#import “ZBarSDK.h” 即可使用
- */
- - (void)QRscan{
- _reader = [ZBarReaderViewController new];
- _reader.readerDelegate = self;
- //非全屏
- _reader.wantsFullScreenLayout = NO;
- //隐藏底部控制按钮
- _reader.showsZBarControls = NO;
- //设置自己定义的界面
- [self setOverlayPickerView:_reader];
- ZBarImageScanner *scanner = _reader.scanner;
- [scanner setSymbology: ZBAR_I25
- config: ZBAR_CFG_ENABLE
- to: 0];
- [self presentViewController:_reader animated:NO completion:nil];
- }
- - (void)setOverlayPickerView:(ZBarReaderViewController *)reader{
- //清除原有控件
- for (UIView *temp in [reader.view subviews]) {
- for (UIButton *button in [temp subviews]) {
- if ([button isKindOfClass:[UIButton class]]) {
- [button removeFromSuperview];
- }
- }
- for (UIToolbar *toolbar in [temp subviews]) {
- if ([toolbar isKindOfClass:[UIToolbar class]]) {
- [toolbar setHidden:YES];
- [toolbar removeFromSuperview];
- }
- }
- }
- //提示
- [_labelAlert removeFromSuperview];
- [reader.view addSubview:_labelAlert];
- //边框
- [_imageview removeFromSuperview];
- [_imageview.layer setBorderWidth:1];
- [_imageview.layer setBorderColor:[[UIColor whiteColor] CGColor]];
- [reader.view addSubview:_imageview];
- //取消操作
- [_cancelBut removeFromSuperview];
- _cancelBut.alpha = 0.7;
- [_cancelBut.layer setCornerRadius:5];
- [_cancelBut addTarget:self action:@selector(dismissOverlayView:)forControlEvents:UIControlEventTouchUpInside];
- [reader.view addSubview:_cancelBut];
- }
- //当找到条形码时,会执行代理方法,最后读取并显示了条形码的图片和内容
- - (void) imagePickerController: (UIImagePickerController*) reader
- didFinishPickingMediaWithInfo: (NSDictionary*) info
- {
- id<NSFastEnumeration> results =
- [info objectForKey: ZBarReaderControllerResults];
- ZBarSymbol *symbol = nil;
- for(symbol in results)
- break;
- // _imageview.image =
- // [info objectForKey: UIImagePickerControllerOriginalImage];
- // [reader dismissViewControllerAnimated:YES completion:nil];
- //判断是否包含 头'http:'
- NSString *regex = @"http+:[^\\s]*";
- NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
- //判断是否包含 头'ssid:'
- NSString *ssid = @"ssid+:[^\\s]*";;
- NSPredicate *ssidPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",ssid];
- //解决ZBar 乱码不需要静态库
- //在自己的应用中调用下面的代码处理下获取的string即可
- //识别扫描后的信息类型
- NSString *symbolStr = symbol.data;
- //zbar是日本人开发的,需要将默认的日文编码改为UTF8,否则扫描“坑爹”和“尼玛啊”等会出现乱码
- if ([symbolStr canBeConvertedToEncoding:NSShiftJISStringEncoding])
- {
- symbolStr = [NSString stringWithCString:[symbolStr cStringUsingEncoding: NSShiftJISStringEncoding] encoding:NSUTF8StringEncoding];
- }
- //label.text = symbol.data ;
- _urlStr = symbolStr;
- if(_urlStr != nil && ![_urlStr isEqualToString:@""] && symbolStr.length > 7){
- UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"提示"
- message:[NSString stringWithFormat:@"链接:%@",_urlStr]
- delegate:self
- cancelButtonTitle:@"取消"
- otherButtonTitles:@"跳转", nil nil];
- [alert show];
- }
- }
- //取消button方法
- - (void)dismissOverlayView:(id)sender{
- [_reader dismissViewControllerAnimated:NO completion:nil];
- // [self.view removeFromSuperview];
- [self.navigationController popViewControllerAnimated:YES];
- }
- #pragma mark UIAlertViewDelegate
- - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
- //取消
- if(buttonIndex == 0){
- }
- //确定
- if(buttonIndex == 1){
- [_reader dismissViewControllerAnimated:NO completion:nil];
- NSURL *url = [[NSURL alloc] initWithString:_urlStr];
- _webView.delegate = self;
- [_webView setFrame:self.view.bounds];
- [self.view addSubview:_webView];
- NSURLRequest *request=[ NSURLRequest requestWithURL :url];
- [_webView loadRequest :request];
- //等待页面
- NSString* msg = @"正在加载,请稍候...";
- _waitV = [[SZWaitView alloc] initWithString:msg];
- CGRect theRect = self.view.bounds;
- theRect.size.height = theRect.size.height + 40;
- [_waitV setBounds:theRect];
- _waitV.center = self.view.center;
- [_waitV setHidden:NO];
- [self.view addSubview:_waitV];
- }
- }
- #pragma mark UIWebViewDelegate
- - (void)webViewDidStartLoad:(UIWebView *)webView{
- }
- - (void)webViewDidFinishLoad:(UIWebView *)webView{
- _waitV.hidden = YES;
- [_waitV removeFromSuperview];
- _waitV = nil;
- }
- - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
- _waitV.hidden = YES;
- [_waitV removeFromSuperview];
- _waitV = nil;
- }
- @end
图例: