iOS 抖動(dòng)動(dòng)畫

/// 抖動(dòng)方向枚舉
public enum ShakeDirection {
    /// 水平抖動(dòng)
    case horizontal
    /// 垂直抖動(dòng)
    case vertical
}

extension UIView {
    /// 擴(kuò)展UIView增加抖動(dòng)方法
    ///
    /// - Parameters:
    ///   - direction: 抖動(dòng)方向(默認(rèn)是水平方向)
    ///   - times: 抖動(dòng)次數(shù)(默認(rèn)6次)
    ///   - interval: 每次抖動(dòng)時(shí)間(默認(rèn)0.1秒)
    ///   - delta: 抖動(dòng)偏移量(默認(rèn)4)
    ///   - completion: 抖動(dòng)動(dòng)畫結(jié)束后的回調(diào)
    public func shake(direction: ShakeDirection = .horizontal, times: Int = 6, interval: TimeInterval = 0.1, delta: CGFloat = 4, completion: ((Bool) -> ())? = nil) {
        
        UIView.animate(withDuration: interval, animations: {
            switch direction {
            case .horizontal:
                self.layer.setAffineTransform( CGAffineTransform(translationX: delta, y: 0))
            case .vertical:
                self.layer.setAffineTransform( CGAffineTransform(translationX: 0, y: delta))
            }

        }) { (_) in
            
            if (times == 0) { // 最后一次抖動(dòng),將位置還原,并調(diào)用完成回調(diào)函數(shù)
                UIView.animate(withDuration: interval, animations: {
                    self.layer.setAffineTransform(CGAffineTransform.identity)
                }, completion: completion)
            } else { // 不是最后一次抖動(dòng),繼續(xù)播放動(dòng)畫(總次數(shù)減1,偏移位置反向)
                self.shake(direction: direction, times: times - 1,  interval: interval, delta: delta * -1, completion:completion)
            }
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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