IOS开发——ZBar自定义界面

来源:互联网 发布:单机围棋软件 编辑:程序博客网 时间:2024/06/05 02:59

Demo地址:http://download.csdn.net/detail/u012881779/7977507

 ZBar是一个开源库,用于扫描、读取二维码和条形码。支持的二维码包括:EAN/UPC,QR等。可以扫描含有链接的二维码,并且读取到结果后直接跳转到对应的链接。

[objc] view plaincopyprint?
  1. //  二维码扫描  
  2. #import <UIKit/UIKit.h>  
  3. @interface WXQrCodeScanning : UIViewController  
  4. @property (weak, nonatomic) IBOutlet UIImageView *imageview; //边框  
  5. @property (weak, nonatomic) IBOutlet UILabel     *labelAlert;//提示  
  6. @property (weak, nonatomic) IBOutlet UIButton    *cancelBut; //取消  
  7.   
  8. //扫描  
  9. - (void)QRscan;  
  10. @end  
  11.   
  12. #import "WXQrCodeScanning.h"  
  13. #import "ZBarSDK.h"  
  14. #import "QRCodeGenerator.h"  
  15. #import "SZNGTipView.h"  
  16. @interface WXQrCodeScanning ()<ZBarReaderDelegate,UIAlertViewDelegate,UIWebViewDelegate>  
  17.   
  18. @property (strongnonatomic) SZWaitView        *waitV;         //等待页面  
  19. @property (strongnonatomic) UIWebView         *webView;       //二维码跳转页面  
  20. @property (strongnonatomic) NSString          *urlStr;        //链接  
  21. @property (strongnonatomicZBarReaderViewController *reader;  
  22. @end  
  23.   
  24. @implementation WXQrCodeScanning  
  25. @synthesize imageview = _imageview;  
  26. @synthesize waitV     = _waitV;  
  27. @synthesize webView   = _webView;  
  28. @synthesize urlStr    = _urlStr;  
  29. @synthesize reader    = _reader;  
  30.   
  31. - (void)viewDidLoad  
  32. {  
  33.     [super viewDidLoad];  
  34. }  
  35. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  
  36. {  
  37.     return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);  
  38. }  
  39. //扫描  
  40. /*扫描二维码部分: 
  41.  导入ZBarSDK文件并引入一下框架 
  42.  AVFoundation.framework 
  43.  CoreMedia.framework 
  44.  CoreVideo.framework 
  45.  QuartzCore.framework 
  46.  libiconv.dylib 
  47.  引入头文件#import “ZBarSDK.h” 即可使用 
  48.  */  
  49.   
  50. - (void)QRscan{  
  51.     _reader = [ZBarReaderViewController new];  
  52.     _reader.readerDelegate = self;  
  53.     //非全屏  
  54.     _reader.wantsFullScreenLayout = NO;  
  55.     //隐藏底部控制按钮  
  56.     _reader.showsZBarControls = NO;  
  57.     //设置自己定义的界面  
  58.     [self setOverlayPickerView:_reader];  
  59.     ZBarImageScanner *scanner = _reader.scanner;  
  60.     [scanner setSymbology: ZBAR_I25  
  61.                    config: ZBAR_CFG_ENABLE  
  62.                        to: 0];  
  63.     [self presentViewController:_reader animated:NO completion:nil];  
  64. }  
  65.   
  66. - (void)setOverlayPickerView:(ZBarReaderViewController *)reader{  
  67.     //清除原有控件  
  68.     for (UIView *temp in [reader.view subviews]) {  
  69.         for (UIButton *button in [temp subviews]) {  
  70.             if ([button isKindOfClass:[UIButton class]]) {  
  71.                 [button removeFromSuperview];  
  72.             }  
  73.         }  
  74.         for (UIToolbar *toolbar in [temp subviews]) {  
  75.             if ([toolbar isKindOfClass:[UIToolbar class]]) {  
  76.                 [toolbar setHidden:YES];  
  77.                 [toolbar removeFromSuperview];  
  78.             }  
  79.         }  
  80.     }  
  81.     
  82.     //提示  
  83.     [_labelAlert removeFromSuperview];  
  84.     [reader.view addSubview:_labelAlert];  
  85.     //边框  
  86.     [_imageview removeFromSuperview];  
  87.     [_imageview.layer setBorderWidth:1];  
  88.     [_imageview.layer setBorderColor:[[UIColor whiteColor] CGColor]];  
  89.     [reader.view addSubview:_imageview];  
  90.     //取消操作  
  91.     [_cancelBut removeFromSuperview];  
  92.     _cancelBut.alpha = 0.7;  
  93.     [_cancelBut.layer setCornerRadius:5];  
  94.     [_cancelBut addTarget:self action:@selector(dismissOverlayView:)forControlEvents:UIControlEventTouchUpInside];  
  95.     [reader.view addSubview:_cancelBut];  
  96. }  
  97.   
  98. //当找到条形码时,会执行代理方法,最后读取并显示了条形码的图片和内容  
  99. - (void) imagePickerController: (UIImagePickerController*) reader  
  100.  didFinishPickingMediaWithInfo: (NSDictionary*) info  
  101. {  
  102.     id<NSFastEnumeration> results =  
  103.     [info objectForKey: ZBarReaderControllerResults];  
  104.     ZBarSymbol *symbol = nil;  
  105.     for(symbol in results)  
  106.         break;  
  107.       
  108. //    _imageview.image =  
  109. //    [info objectForKey: UIImagePickerControllerOriginalImage];  
  110. //    [reader dismissViewControllerAnimated:YES completion:nil];  
  111.     //判断是否包含 头'http:'  
  112.     NSString *regex = @"http+:[^\\s]*";  
  113.     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];  
  114.       
  115.     //判断是否包含 头'ssid:'  
  116.     NSString *ssid = @"ssid+:[^\\s]*";;  
  117.     NSPredicate *ssidPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",ssid];  
  118.       
  119.     //解决ZBar 乱码不需要静态库  
  120.     //在自己的应用中调用下面的代码处理下获取的string即可  
  121.     //识别扫描后的信息类型  
  122.     NSString *symbolStr = symbol.data;  
  123.     //zbar是日本人开发的,需要将默认的日文编码改为UTF8,否则扫描“坑爹”和“尼玛啊”等会出现乱码  
  124.     if ([symbolStr canBeConvertedToEncoding:NSShiftJISStringEncoding])  
  125.     {  
  126.         symbolStr = [NSString stringWithCString:[symbolStr cStringUsingEncoding: NSShiftJISStringEncoding] encoding:NSUTF8StringEncoding];  
  127.     }  
  128.     //label.text =  symbol.data ;  
  129.     _urlStr =  symbolStr;  
  130.     if(_urlStr != nil && ![_urlStr isEqualToString:@""] && symbolStr.length > 7){  
  131.         UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"提示"  
  132.                                                         message:[NSString stringWithFormat:@"链接:%@",_urlStr]  
  133.                                                        delegate:self  
  134.                                               cancelButtonTitle:@"取消"  
  135.                                               otherButtonTitles:@"跳转", nil nil];  
  136.         [alert show];  
  137.     }  
  138. }  
  139. //取消button方法  
  140. - (void)dismissOverlayView:(id)sender{  
  141.     [_reader dismissViewControllerAnimated:NO completion:nil];  
  142. //    [self.view removeFromSuperview];  
  143.     [self.navigationController popViewControllerAnimated:YES];  
  144. }  
  145.   
  146. #pragma mark UIAlertViewDelegate  
  147. - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{  
  148.     //取消  
  149.     if(buttonIndex == 0){  
  150.     }  
  151.     //确定  
  152.     if(buttonIndex == 1){  
  153.         [_reader dismissViewControllerAnimated:NO completion:nil];  
  154.           
  155.         NSURL *url = [[NSURL alloc] initWithString:_urlStr];  
  156.         _webView.delegate = self;  
  157.         [_webView setFrame:self.view.bounds];  
  158.         [self.view addSubview:_webView];  
  159.         NSURLRequest *request=[ NSURLRequest requestWithURL :url];  
  160.         [_webView loadRequest :request];  
  161.           
  162.         //等待页面  
  163.         NSString* msg = @"正在加载,请稍候...";  
  164.         _waitV = [[SZWaitView alloc] initWithString:msg];  
  165.         CGRect theRect = self.view.bounds;  
  166.         theRect.size.height = theRect.size.height + 40;  
  167.         [_waitV setBounds:theRect];  
  168.         _waitV.center = self.view.center;  
  169.         [_waitV setHidden:NO];  
  170.         [self.view addSubview:_waitV];  
  171.     }  
  172. }  
  173. #pragma mark UIWebViewDelegate  
  174. - (void)webViewDidStartLoad:(UIWebView *)webView{  
  175.       
  176. }  
  177. - (void)webViewDidFinishLoad:(UIWebView *)webView{  
  178.     _waitV.hidden = YES;  
  179.     [_waitV removeFromSuperview];  
  180.     _waitV = nil;  
  181. }  
  182. - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{  
  183.     _waitV.hidden = YES;  
  184.     [_waitV removeFromSuperview];  
  185.     _waitV = nil;  
  186. }  
  187.   
  188. @end  
  189.    

图例:




0 0