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!)
}
}
}