Swift

Swift 添加两种遮罩的方式

2019-02-01  本文已影响0人  foolish_hungry
没有遮罩前的效果
image.png

代码实现

let middleView = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
middleView.backgroundColor = UIColor.green
view.addSubview(middleView)
middleView.center = view.center
遮罩方式一
image.png

代码实现

let middleView = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
middleView.backgroundColor = UIColor.green
view.addSubview(middleView)
middleView.center = view.center
middleView.layer.mask = maskLayer1(with: middleView.bounds)

func maskLayer1(with rect: CGRect) -> CAShapeLayer {
        let x = rect.size.width / 2.0
        let y = rect.size.height / 2.0
        let radius = min(x, y) * 0.8
        
        let bezierPath = UIBezierPath(arcCenter: CGPoint(x: x, y: y), radius: radius, startAngle: 0.0, endAngle: CGFloat(2 * Double.pi), clockwise: true)
        let shapeLayer = CAShapeLayer()
        shapeLayer.path = bezierPath.cgPath
        shapeLayer.fillRule = .nonZero
        return shapeLayer
}
遮罩方式二
image.png

代码实现

let middleView = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
middleView.backgroundColor = UIColor.green
view.addSubview(middleView)
middleView.center = view.center
middleView.layer.mask = maskLayer2(with: middleView.bounds)

func maskLayer2(with rect: CGRect) -> CAShapeLayer {
        let path =  UIBezierPath(rect:rect)

        let x = rect.width / 2.0
        let y = rect.height / 2.0
        let radius = min(x, y) * 0.5
        let bezierPath = UIBezierPath(arcCenter: CGPoint(x: x, y: y), radius: radius, startAngle: 0.0, endAngle: CGFloat(2 * Double.pi), clockwise: true)

        path.append(bezierPath)
        
        let shapeLayer = CAShapeLayer()
        shapeLayer.path = path.cgPath
        shapeLayer.fillRule = .evenOdd
        return shapeLayer
}
实战 -- 二维码扫描区域遮罩
IMG_0288.png

代码实现

var session:AVCaptureSession!
var screenWidth : CGFloat!
var screenHeight:CGFloat!


let middleView = UIView(frame: CGRect(x: 0, y: 0, width: screenWidth, height: screenHeight))
middleView.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.8)
view.addSubview(middleView)
middleView.center = view.center
middleView.layer.mask = maskLayer2(with: middleView.bounds)
middleView.layer.addSublayer(borderLayer(width: 2.0, color: UIColor.white))
    
setCamera()


func maskLayer2(with rect: CGRect) -> CAShapeLayer {
        let path =  UIBezierPath(rect:rect)
        
        // 识别区域是个圆角矩形
        let fWifth: CGFloat = 200.0
        let fHeight = fWifth
        let x = rect.width / 2.0 - fWifth / 2.0
        let y = rect.height / 2.0 - fHeight / 2.0
        let bezierPath = UIBezierPath(roundedRect: CGRect(origin: CGPoint(x: x, y: y), size: CGSize(width: fWifth, height: fHeight)), cornerRadius: 10)
        path.append(bezierPath)
        
        let shapeLayer = CAShapeLayer()
        shapeLayer.path = path.cgPath
        shapeLayer.fillRule = .evenOdd
        return shapeLayer
    }
    
    func borderLayer(width: CGFloat, color: UIColor) -> CAShapeLayer {
        let fWifth: CGFloat = 200.0
        let fHeight = fWifth
        let x = screenWidth / 2.0 - fWifth / 2.0
        let y = screenHeight / 2.0 - fHeight / 2.0
        let bezierPath = UIBezierPath(roundedRect: CGRect(origin: CGPoint(x: x, y: y), size: CGSize(width: fWifth, height: fHeight)), cornerRadius: 10)
        
        let shapeLayer = CAShapeLayer()
        shapeLayer.path = bezierPath.cgPath
        shapeLayer.strokeColor = color.cgColor
        shapeLayer.lineWidth = width
        shapeLayer.fillColor = UIColor.clear.cgColor
        return shapeLayer
    }
    
    func setCamera(){
        
        //获取摄像设备
        guard let device = AVCaptureDevice.default(for: AVMediaType.video) else {
            return
        }
        
        do {
            //创建输入流
            let input =  try AVCaptureDeviceInput(device: device)
            //创建输出流
            let output = AVCaptureMetadataOutput()
            //设置会话
            session = AVCaptureSession()
            //连接输入输出
            if session.canAddInput(input){
                session.addInput(input)
            }
            if session.canAddOutput(output){
                session.addOutput(output)
                //设置输出流代理,从接收端收到的所有元数据都会被传送到delegate方法,所有delegate方法均在queue中执行
                output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
                //设置扫描二维码类型
                output.metadataObjectTypes = [ AVMetadataObject.ObjectType.qr]
                //扫描区域
                //rectOfInterest 属性中x和y互换,width和height互换。
                output.rectOfInterest = CGRect(x: 100/screenHeight, y: (screenWidth/2-100)/screenWidth, width: 200/screenHeight, height: 200/screenWidth)
            }
            //捕捉图层
            let previewLayer = AVCaptureVideoPreviewLayer(session: session)
            previewLayer.videoGravity = .resizeAspectFill
            previewLayer.frame = self.view.layer.bounds
            self.view.layer.insertSublayer(previewLayer, at: 0)
            //持续对焦
            if device.isFocusModeSupported(.continuousAutoFocus){
                try  input.device.lockForConfiguration()
                input.device.focusMode = .continuousAutoFocus
                input.device.unlockForConfiguration()
            }
            session.startRunning()
        } catch  {
        }
    }
    
    //扫描完成的代理
    func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
        session?.stopRunning()
        if let metadataObject = metadataObjects.first {
            let readableObject = metadataObject as! AVMetadataMachineReadableCodeObject
            let str = readableObject.stringValue!
            let url = URL(string: str)
            //用网页打开扫描的信息
            if #available(iOS 10, *){
                UIApplication.shared.open(url!, options: [:], completionHandler: nil)
            }else{
                UIApplication.shared.openURL(url!)
            }
        }
    }

参考链接

上一篇 下一篇

猜你喜欢

热点阅读