【iOS】mask的一種應(yīng)用場景

學(xué)習(xí)文章

高級mask應(yīng)用

效果

Mask1.gif
Mask2.gif

源碼


import UIKit

class ViewController: UIViewController {
    
    var movedMask:CALayer?
    

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = UIColor.blackColor()
        
        mask()
        
//        emitterMask()
        
    }
    
    func handlePan(recongnizer: UIPanGestureRecognizer) {
    
        // 拖拽
        let translation: CGPoint = recongnizer.translationInView(view)
        recongnizer.view?.center = CGPoint(x: (recongnizer.view?.center.x)! + translation.x, y: (recongnizer.view?.center.y)! + translation.y)
        recongnizer.setTranslation(CGPoint(x: 0, y: 0), inView: view)
        
        // 關(guān)閉CoreAnimation實(shí)時隱式動畫繪制(核心)
        CATransaction.setDisableActions(true)
        movedMask?.position = (recongnizer.view?.center)!
    }
    
    func mask() {
    
        // 背景圖片與mask圖片
        let backgroundImage: UIImage = UIImage(named: "background")!
        let maskImage:       UIImage = UIImage(named: "mask")!
        
        // 背景圖片顯示
        let backgroundIV: UIImageView = UIImageView(frame: view.bounds)
        backgroundIV.image = backgroundImage.grayScale()
        view.addSubview(backgroundIV)
        
        // 遮罩圖片顯示
        let backgroundChangedIV: UIImageView = UIImageView(frame: view.bounds)
        backgroundChangedIV.image = backgroundImage
        view.addSubview(backgroundChangedIV)
        
        // 形成遮罩
        movedMask = CALayer()
        movedMask?.frame = CGRect(origin: CGPointZero, size: maskImage.size)
        movedMask?.contents = maskImage.CGImage
        movedMask?.position = view.center
        backgroundChangedIV.layer.mask = movedMask
        
        // 拖拽的view
        let dragView: UIView = UIView(frame: CGRect(origin: CGPointZero, size: maskImage.size))
        dragView.center = view.center
        view.addSubview(dragView)
        
        // 給dragView添加拖拽手勢
        let pan: UIPanGestureRecognizer = UIPanGestureRecognizer(target: self, action: "handlePan:")
        dragView.addGestureRecognizer(pan)
    }
    
    func emitterMask() {
    
        // 創(chuàng)建粒子layer
        let snowEmitter: CAEmitterLayer = CAEmitterLayer()
        
        // 粒子發(fā)射位置
        snowEmitter.emitterPosition = CGPoint(x: 120, y: 0)
        
        // 發(fā)射源的尺寸大小
        snowEmitter.emitterSize = view.bounds.size
        
        // 發(fā)射模式
        snowEmitter.emitterMode = kCAEmitterLayerSurface
        
        // 發(fā)射源的形狀
        snowEmitter.emitterShape = kCAEmitterLayerLine
        
        // 創(chuàng)建雪花類型的粒子
        let snowFlake: CAEmitterCell = CAEmitterCell()
        
        // 粒子的名字
        snowFlake.name = "snow"
        
        // 粒子參數(shù)的速度乘數(shù)因子
        snowFlake.birthRate = 15
        snowFlake.lifetime  = 60
        
        // 粒子速度
        snowFlake.velocity = 10
        
        // 粒子的速度范圍
        snowFlake.velocityRange = 10
        
        // 粒子y方向的加速度分量
        snowFlake.yAcceleration = 20
        
        // 周圍發(fā)射角度
        snowFlake.emissionRange = CGFloat(0.5 * M_PI)
        
        // 子旋轉(zhuǎn)角度范圍
        snowFlake.spinRange = CGFloat(0.25 * M_PI)
        snowFlake.contents  = UIImage(named: "snow")?.CGImage
        
        // 設(shè)置雪花形狀粒子的顏色
        snowFlake.color = UIColor.whiteColor().CGColor
        
        snowFlake.scale      = 0.2
        snowFlake.scaleRange = 0.2
        
        snowEmitter.shadowOpacity = 1
        snowEmitter.shadowRadius  = 0
        snowEmitter.shadowOffset  = CGSizeZero
        
        // 粒子邊緣的顏色
        snowEmitter.shadowColor = UIColor.whiteColor().CGColor
        
        // 添加粒子
        snowEmitter.emitterCells = [snowFlake]
        
        // 將粒子layer添加進(jìn)圖層
        view.layer.addSublayer(snowEmitter)
        
        // 形成遮罩
        let maskImage: UIImage = UIImage(named: "mask")!
        movedMask = CALayer()
        movedMask?.frame = CGRect(origin: CGPointZero, size: maskImage.size)
        movedMask?.contents = maskImage.CGImage
        movedMask?.position = view.center
        snowEmitter.mask = movedMask
        
        // 拖拽的view
        let dragView: UIView = UIView(frame: CGRect(origin: CGPointZero, size: maskImage.size))
        dragView.center = view.center
        view.addSubview(dragView)
        
        // 給dragView添加拖拽手勢
        let pan: UIPanGestureRecognizer = UIPanGestureRecognizer(target: self, action: "handlePan:")
        dragView.addGestureRecognizer(pan)
        
    }
}

下載源碼

下載地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,323評論 25 708
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,632評論 4 61
  • 我想封緘口舌 不想吃飯 不想動 只想安安靜靜坐著 坐在我的城里 看云看花又看海 甚至想看破紅塵 投身云霧煙海 佛祖...
    風(fēng)與閱讀 66評論 1 2
  • 里里大耳朵閱讀 201評論 0 0
  • 我覺得我現(xiàn)在就是一個24歲的人該有的樣子,天真爛漫,有一點(diǎn)兒社會經(jīng)驗(yàn),又不是那么成熟,知道一些事情,也接受一些事情...

友情鏈接更多精彩內(nèi)容