Demo地址:http://download.csdn.net/detail/u012881779/7977507
/* 二维码扫描 */
#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];
[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
图例: