前言
休了半年產(chǎn)假,回來發(fā)現(xiàn)快要不會寫代碼了拆吆。慢慢琢磨了一小段代碼僅供自己參考
效果.gif
思考
首先想需要再當(dāng)前的view
中間摳掉一個圓實現(xiàn)局部透明的遮罩效果聋迎。而 CAShapeLayer
的 fillRule
屬性可以幫我們實現(xiàn)這個過程。奇偶填充規(guī)則(Even Odd Fill Rule
)指的是:在繪制 UIBezierPath
的過程中枣耀,會碰到同一個點被覆蓋多次的情況霉晕。當(dāng)一個點被覆蓋偶數(shù)(0 屬于偶數(shù))次的時候,表示其位于圖像外奕枢,而奇數(shù)次則表示位于圖形內(nèi)娄昆。位于圖形內(nèi)的點會被填充顏色佩微,位于圖形外的則不會缝彬。總結(jié)就是奇數(shù)填充哺眯,偶數(shù)不填充
那么:
let roundRect = CGRect(x: (ScreenWidth - 235) / 2.0, y: 100, width: 235, height: 235)
// 繪制第一個矩形path為當(dāng)前view的視圖
let path = UIBezierPath(rect: UIScreen.main.bounds)
// 繪制第二個圓形path為攝像頭大小
let bezierPath = UIBezierPath(roundedRect: roundRect, cornerRadius: 235 / 2)
path.append(bezierPath)
let shaperLayer = CAShapeLayer()
// 奇數(shù)填充谷浅,偶數(shù)不填充
shaperLayer.fillRule = .evenOdd
shaperLayer.fillColor = UIColor.white.cgColor
shaperLayer.path = path.cgPath
view.layer.addSublayer(shaperLayer)
// 為方便看出效果,可以把當(dāng)前的view視圖設(shè)置一個顏色
view.backgroundColor = UIColor.lightGray
運行之后可以看到如下效果:
奇偶填充規(guī)則.gif
添加外圈動畫
首先把圖片添加上去
let outImageView = UIImageView()
outImageView.image = UIImage(named: "face_animation_0")
view.addSubview(outImageView)
let imgCenterY = roundRect.origin.y + roundRect.height / 2.0
outImageView.snp.makeConstraints { (make) in
make.centerX.equalToSuperview()
make.centerY.equalTo(imgCenterY)
make.size.equalTo(CGSize(width: 280, height: 280))
}
let inImageView = UIImageView()
inImageView.image = UIImage(named: "face_animation_1")
view.addSubview(inImageView)
inImageView.snp.makeConstraints { (make) in
make.centerX.equalToSuperview()
make.centerY.equalTo(imgCenterY)
make.size.equalTo(CGSize(width: 270, height: 270))
}
圖片.png
給圖片添加動畫
let roationAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
roationAnimation.fromValue = 0
roationAnimation.toValue = Double.pi * 2
roationAnimation.repeatCount = MAXFLOAT
roationAnimation.speed = 1
roationAnimation.duration = 3
roationAnimation.isRemovedOnCompletion = false
outImageView.layer.add(roationAnimation, forKey: nil)
let roationAnimation1 = CABasicAnimation(keyPath: "transform.rotation.z")
roationAnimation1.fromValue = 0
roationAnimation1.toValue = -Double.pi * 2
roationAnimation1.repeatCount = MAXFLOAT
roationAnimation1.speed = 1
roationAnimation1.duration = 3
roationAnimation1.isRemovedOnCompletion = false
inImageView.layer.add(roationAnimation1, forKey: nil)
動畫.gif
打開前置攝像頭
//音頻視頻相關(guān)類,記得在info.plist文件配置NSCameraUsageDescription
private var device: AVCaptureDevice!
private var videoPrelayer: AVCaptureVideoPreviewLayer!
private var input: AVCaptureDeviceInput!
private var output: AVCaptureStillImageOutput!
private var session: AVCaptureSession!
//獲取后置攝像頭設(shè)備對象
for item in AVCaptureDevice.devices(for: .video) {
if item.position == .front {
device = item
}
}
// 創(chuàng)建媒體管理會話
session = AVCaptureSession()
// 創(chuàng)建輸入數(shù)據(jù)對象
input = try? AVCaptureDeviceInput.init(device: device)
// 創(chuàng)建輸出數(shù)據(jù)對象
output = AVCaptureStillImageOutput()
output.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
//添加輸入數(shù)據(jù)對象和輸出對象到會話中
if session.canAddInput(input) {
session.addInput(input)
}
if session.canAddOutput(output) {
session.addOutput(output)
}
// 創(chuàng)建視頻預(yù)覽圖層
videoPrelayer = AVCaptureVideoPreviewLayer.init(session: session)
videoPrelayer.videoGravity = .resizeAspectFill
videoPrelayer.frame = roundRect
// 插入圖層在view視圖的最下方
view.layer.insertSublayer(videoPrelayer, at: 0)
session.startRunning()
運行一疯,效果就出來了撼玄。