美文网首页Swift
Swift 添加两种遮罩的方式

Swift 添加两种遮罩的方式

作者: foolish_hungry | 来源:发表于2019-02-01 11:53 被阅读0次
    没有遮罩前的效果
    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!)
                }
            }
        }
    

    参考链接

    相关文章

      网友评论

        本文标题:Swift 添加两种遮罩的方式

        本文链接:https://www.haomeiwen.com/subject/gbarsqtx.html