• iOS 开发之 ZBarSDK 二维码扫描自定义二维码扫描页面(二)


    iOS 开发之 ZBarSDK 二维码扫描自定义二维码扫描页面()

    上一篇解决了ZBarSDK不支持64bit的问题,下面我们就可以使用ZBarSDK了。

    导入ZBarSDk.h文件

    附上代码:

    //

    //  MeViewController.m

    //  Auditory Blog

    //

    //  Created by 寒竹子 on 15/4/28.

    //  Copyright (c) 2015年 寒竹子. All rights reserved.

    //

    #define ScanWidth  220

    #define ScanHeight 220

    #import "MeViewController.h"

    #import "ZBarSDK.h"

    @interface MeViewController ()<ZBarReaderDelegate>

    @property (nonatomic, strong) UIImageView * imageView;

    @property (nonatomic, strong) UIView * scanLine; // 扫描仪

    @property (nonatomic, strong) NSTimer * timer;

    @end

    @implementation MeViewController

    /**

     * @brief  初始化UI

     *

     * @param

     * @return

     */

    - (void)setupUI

    {

        self.view.backgroundColor = RGB(248, 248, 248, 1.0f);

        UIButton * scanBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 200, self.view.frame.size.width, 30)];

        [scanBtn setTitle:@"扫描二维码" forState:UIControlStateNormal];

        scanBtn.titleLabel.font = TextFont(16.0f);

        [scanBtn setTitleColor:RGB(10, 10, 10, 1.0f) forState:UIControlStateNormal];

        [scanBtn addTarget:self action:@selector(scanAction) forControlEvents:UIControlEventTouchUpInside];

        

        [self.view addSubview:scanBtn];

        

        _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 300, 200, 100)];

        [self.view addSubview:_imageView];

    }

    /**

     * @brief  起一个定时器

     *

     * @param

     * @return

     */

    - (void)startTimer

    {

        _timer = [NSTimer scheduledTimerWithTimeInterval:.02f target:self selector:@selector(updateScanLine) userInfo:nil repeats:YES];

        [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];

    }

    /**

     * @brief  停止定时器

     *

     * @param

     * @return

     */

    - (void)stopTimer

    {

        if ([_timer isValid]) {

            [_timer invalidate];

            _timer = nil;

        }

    }

    /**

     * @brief  扫描二维码

     *

     * @param

     * @return

     */

    - (void)scanAction

    {

        ZBarReaderViewController * readerVc = [[ZBarReaderViewController alloc] init];

        readerVc.readerDelegate = self;

        

        // 非全屏

        readerVc.wantsFullScreenLayout = NO;

        

        // 隐藏底部控制按钮

        readerVc.showsZBarControls = NO;

        

        // 设置自己定义的界面

        [self setOverlayPickerView:readerVc];

        

        ZBarImageScanner * scanner = readerVc.scanner;

        [scanner setSymbology:ZBAR_I25 config:ZBAR_CFG_ENABLE to:0];

        

        [self presentViewController:readerVc animated:YES completion:nil];

        [self startTimer];

    }

    - (void)setOverlayPickerView:(ZBarReaderViewController *)readerVc

    {

        // 清除原有的控件

        for (UIView * temp in [readerVc.view subviews]) {

            for (UIButton * btn in [temp subviews]) {

                if ([btn isKindOfClass:[UIButton class]]) {

                    [btn removeFromSuperview];

                }

            }

            

            for (UIToolbar * toolBar in [temp subviews]) {

                if ([toolBar isKindOfClass:[UIToolbar class]]) {

                    [toolBar setHidden:YES];

                    

                    [toolBar removeFromSuperview];

                }

            }

        }

        

        // 画中间的基准线

        _scanLine = [[UIView alloc] initWithFrame:CGRectMake((self.view.frame.size.width - ScanWidth) / 2.0f, (self.view.frame.size.height - ScanHeight) / 2.0f, ScanWidth, 1)];

        _scanLine.backgroundColor = [UIColor redColor];

        

        [readerVc.view addSubview:_scanLine];

        

        // 最上部的View

        UIView * upView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, (self.view.frame.size.height - ScanHeight) / 2.0f)];

        upView.alpha = .4f;

        upView.backgroundColor = [UIColor blackColor];

        

        [readerVc.view addSubview:upView];

        

        // 用于说明的label

        UILabel * infoLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 20, self.view.frame.size.width - 40, 60)];

        infoLabel.backgroundColor = [UIColor clearColor];

        infoLabel.numberOfLines = 2;

        infoLabel.font = TextFont(15.0f);

        infoLabel.textColor = [UIColor whiteColor];

        infoLabel.text = @"将二维码置于矩形方框内,离手机摄像头10CM左右,系统会自动识别。";

        [upView addSubview:infoLabel];

        

        // 左侧的view

        

        UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(upView.frame), (self.view.frame.size.width - ScanWidth) / 2.0f, ScanHeight)];

        

        leftView.alpha = 0.4;

        

        leftView.backgroundColor = [UIColor blackColor];

        

        [readerVc.view addSubview:leftView];

        

        // 右侧的view

        

        UIView *rightView = [[UIView alloc] initWithFrame:CGRectMake(CGRectGetMaxX(leftView.frame) + ScanWidth, leftView.frame.origin.y, (self.view.frame.size.width - ScanWidth) / 2.0f, ScanHeight)];

        

        rightView.alpha = 0.4;

        

        rightView.backgroundColor = [UIColor blackColor];

        

        [readerVc.view addSubview:rightView];

        

        //底部view

        

        UIView * downView = [[UIView alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(leftView.frame), self.view.frame.size.width, self.view.frame.size.height - CGRectGetMaxY(leftView.frame))];

        

        downView.alpha = 0.4;

        

        downView.backgroundColor = [UIColor blackColor];

        

        [readerVc.view addSubview:downView];

        

        // 取消操作的按钮

        UIButton * cancelBtn = [[UIButton alloc] initWithFrame:CGRectMake((self.view.frame.size.width - 55) / 2.0f, 30, 70, 70.0f)];

        [cancelBtn setImage:[UIImage imageNamed:@"close"] forState:UIControlStateNormal];

        [cancelBtn addTarget:self action:@selector(closeAction) forControlEvents:UIControlEventTouchUpInside];

        [downView addSubview:cancelBtn];

    }

    /**

     * @brief  更新扫描

     *

     * @param

     * @return

     */

    - (void)updateScanLine

    {

        [UIView animateWithDuration:.01f animations:^{

            CGFloat currentY = _scanLine.frame.origin.y;

            if (currentY >= (self.view.frame.size.height - ScanHeight) / 2.0f + ScanHeight) {

                currentY = (self.view.frame.size.height - ScanHeight) / 2.0f;

            }else {

                currentY += 1.0f;

            }

            

            CGRect frame = _scanLine.frame;

            frame.origin.y = currentY;

            _scanLine.frame = frame;

        } completion:nil];

    }

    /**

     * @brief  关闭扫描页面

     *

     * @param

     * @return

     */

    - (void)closeAction

    {

        [self stopTimer];

        [self dismissViewControllerAnimated:YES completion:nil];

    }

    - (void)viewDidLoad {

        [super viewDidLoad];

        

        [self setupUI];

    }

    #pragma mark ZBarSDKDelegate

    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

    {

        id<NSFastEnumeration> results = [info objectForKey:ZBarReaderControllerResults];

        ZBarSymbol * symbol;

        for(symbol in results)

            break;

        

        _imageView.image = [info objectForKey:UIImagePickerControllerOriginalImage];

        [self stopTimer];

        [picker dismissViewControllerAnimated:YES completion:nil];

        

        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:symbol.data]];

    }

    - (void)didReceiveMemoryWarning {

        [super didReceiveMemoryWarning];

    }

    @end

    至此ZBarSDK已经讲解完毕。

  • 相关阅读:
    1系统负荷
    动画
    日常问题记录--JSP页面中通过<s:property value="#parameters.userName[0]>获取URL参数中文时为乱码的解决办法
    linux下替换一个文件中的所有中文字符的方法
    日常问题记录--getJSON函数不执行回调函数的原因总结
    日常问题记录-- java.util.NoSuchElementException
    日常问题记录--POST时,struts2的 request.getParameter找不到参数
    日常问题记录--nested exception is java.lang.NoClassDefFoundError: org/apache/oro/text/regex/MalformedPatternExcept
    mysql系统搭建互备DB(双主)记录
    使用forEach函数绑定函数的上下文
  • 原文地址:https://www.cnblogs.com/hanzhuzi/p/4466375.html
Copyright © 2020-2023  润新知