(Swift)一个轻量级简单易用、UI可完全自定义的扫码组件

1,093 阅读4分钟

ScanHelper

Swift5.0,基于系统API封装的扫描二维码、条形码、等多种条码扫描组件 ScanHelper
注意事项:
⚠️⚠️⚠️ 真机环境运行 ⚠️⚠️⚠️
📣📣📣 platform: ≥ iOS 11
📣📣📣 language: SwiftObjective-C
一)UI样式

二)组件特性
💕 UI界面可完全自定义;
🎉 使用简单,犹如芊芊少女般丝滑、流畅;
🍀 严格遵守Swift代码规范,Demo工程0警告;
💥 无内存泄漏问题,合理释放对象,及时回收内存资源;
🏄 静态库ScanHelperSDK.framework,身轻如燕,仅1.1M大小;
🏆 轻量级,只开启基础使用功能,仅占用12 ~ 16个内存, 启用全部功能, 内存占用在120 ~ 130之间;

三)功能列表
keytypedestruefalse
isSinglebool是否仅识别单一结果,默认true单一结果多个结果
isSquarebool是否展示正方形边框,默认true展示不展示
isSingleFocubool是否开启单点聚焦,默认false开启关闭
isAutoFocusbool是否开启自动对焦,默认true开启关闭
isDoubleTapbool是否支持双击手势,默认true支持不支持
isZoombool是否支持缩放手势,默认true支持不支持
isHasTorchbool是否支持光感检测,自动打开闪光灯,默认true支持不支持
isLimitbool是否自定义底部UI,默认false自定义默认UI
isUnrestrainedbool是否完全自定义UI,默认false自定义默认UI
isDebugDesbool是否打印调试信息,默认true打印不打印
soundSource(String, String)?扫描提示音,默认nil有效资源展示默认不展示
animationImageUIImage?扫描动画样式图,默认nil有效资源展示默认不显示
brightnessMinValueDouble自动开启闪光灯亮度对比值,默认true小于此值开启默认-1
brightnessMaxValueDouble自动关闭闪光灯亮度对比值,默认true大于此值关闭默认6
presetAVCaptureSession.Preset扫描质量inputPriority默认

四)样式列表
keytypedes
marginInt距离左右边界间距(默认60)
lineHeightInt正方形边框粗细(默认0)
lineColorUIColor正方形边框颜色(默认clear)
angleColorUIColor正方形边框4个角颜色(默认orange)
angleLengthInt正方形边框4个角长度(默认30)
angleHeightInt正方形边框4个角高度(默认4)
angleStyleAngleStyle正方形边框边角样式(默认重合)
animationStyleAnimationStyle扫码动画效果(默认无动画)
autoFocuStyleAutoFocuStyle自动聚焦样式(已设默认样式)
animationImageUIImage扫码动画资源图片(可选值,若为空则无动画效果)
unrecognizedAreaUIColor非识别区域背景色(默认黑色,0.5透明度)

五)集成方式
1)CocoaPods
pod 'ScanHelper'
2)手动导入

ScanHelperSDK

1. 下载静态资源包,拷贝导入到工程目录;
2. 选中 TARGETS -> Build Settings -> Framework Search Paths;
3. 配置添加进来的静态库路径;
4. 配置证书,真机模式扫码调试;

六)导入头文件
1)Swift 项目
import ScanHelperSDK
2)Objective-C 项目
#import <ScanHelperSDK/ScanHelperSDK-Swift.h>

七)使用方法
1)基础使用(单一识别结果,默认使用方式)
/// 让控制器持有scanHelper对象,不然会被提前释放
let scanHelper = ScanHelper()
override func viewDidLoad() {
	super.viewDidLoad()
	scanHelper.start(supView: view) { [weak self] (res) in
		guard let self = self else { return }
		print(res)
		self.navigationController?.popViewController(animated: true)
	}
}
2)进阶使用(动画效果,使用属性,调整扫描框样式)
/// 让控制器持有scanHelper对象,不然会被提前释放
let scanHelper = ScanHelper()

override func viewDidLoad() {
	super.viewDidLoad()

	var config = ScanConfig()
        config.sound = Bundle.main.path(forResource: "scan_audio", ofType: "wav")
        config.animationImage = UIImage(named: "scan_animation")
	config.isAutoFocus = false
	config.isHasTorch = false
	config.isZoom = false
	config.isSingle = false

	config.scanStyle.lineColor = .purple
	config.scanStyle.angleStyle = .OutLine
        config.scanStyle.anmiationStyle = .LineCenter
        config.scanStyle.autoFocuStyle.lineColor = .blue

	// and so on ...

	scanHelper.start(supView: view, scanConfig: config) { [weak self] (res) in
		guard let self = self else { return }
		print(res)
		self.navigationController?.popViewController(animated: true)
	}
}
3)高阶使用(自定义UI、获取多个扫描结果)
class ScanHelperViewController: UIViewController, ScanHelperUIDelegate {
    
    /// 让控制器持有scanHelper对象,不然会被提前释放
    let scanHelper = ScanHelper()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        defaultBackgroundColor()
        
        let config = ScanConfig()
        config.isUnrestrained = true
        
        // ⚠️⚠️⚠️scanHandler回调,仅获取单一扫描结果
	// 通过代理方法,获取多个扫描结果
        scanHelper.delegate = self
        scanHelper.start(supView: view, scanConfig: config)
        
    }
    
    // MARK: - 自定义底部视图(获取一个自定义view,从扫描框底部开始计算到父视图底部边缘区域视图)
    func scanLimit(_ bottomView: UIView) {
        bottomView.backgroundColor = .orange
    }
    
    // MARK: - 完全自定义UI视图(获取一个自定义view,frame大小同父视图bounds)
    func scanUnrestrained(_ fullView: UIView) {
        let v = UIView()
        v.frame = CGRect(x: 0, y: 0, width: 200, height: 200)
        fullView.addSubview(v)
    }
    
    // MARK: - 获取一个亮度值
    func scanCaptureOutput(_ brightnessValue: Double) {
        print(brightnessValue)
    }
    
    // MARK: - 多结果返回集合,ScanResult(⚠️⚠️⚠️仅多个结果才会执行此代理方法)
    func scanMetadataOutput(_ values: Array<ScanResult>) {
        print(values)
    }
    
    // MARK: 反初始化器
    deinit {
        print("ScanHelperViewController deinit")
    }
}

八)API引导
1)核心方法
@objc @available(iOS 11.0, *)
/// Start scan
/// - Parameters:
///   - supView: an incoming parent view.
///   - scanConfig: ScanConfig (Default: ScanConfig()).
///   - scanRegion: valid scanning area. The default size is the same as that of the parent view.
///   - scanType: the supported recognizable scanning types are the same as the system API by default.
///   - scanHandler: scan result callback
func start(supView: UIView, scanConfig: ScanConfig, scanRegion: CGRect, scanType: [AVMetadataObject.ObjectType], scanHandler: ((ScanResult) -> Void)?)
@available(iOS 11.0, *)
/// Stop scan
@objc func stop()