要給視圖添加一個(gè)抖動(dòng)效果泼返,比如登錄時(shí)輸入框校驗(yàn)出錯(cuò)給出提示之類的~~~反正就是項(xiàng)目中用到了咯。姨拥。绅喉。
那就寫個(gè)就是了
- 基本思路就是讓視圖左右移動(dòng)或者上下移動(dòng)
調(diào)用視圖的仿射變換函數(shù)就可以了吧
view.layer.setAffineTransform( CGAffineTransform(translationX: 2, y: 0))
這就可以讓視圖往左變換了渠鸽,往右就是-2咯,改Y就是上下唄
- 抖動(dòng)柴罐,抖動(dòng)肯定是有次數(shù)的徽缚,我們根據(jù)次數(shù)來移動(dòng)視圖,每次調(diào)用自身擴(kuò)展修改方向
具體代碼我就粘在下面咯革屠,反正也沒多少行
//
// UIView+ZHYShake.swift
// UIViewShake
//
// Created by ZHY on 2017/8/16.
// Copyright ? 2017年 ZHY. All rights reserved.
//
import UIKit
/// 抖動(dòng)方向
///
/// - horizontal: 水平抖動(dòng)
/// - vertical: 垂直抖動(dòng)
public enum ZHYShakeDirection: Int {
case horizontal
case vertical
}
extension UIView {
/// ZHY 擴(kuò)展UIView增加抖動(dòng)方法
///
/// - Parameters:
/// - direction: 抖動(dòng)方向 默認(rèn)水平方向
/// - times: 抖動(dòng)次數(shù) 默認(rèn)5次
/// - interval: 每次抖動(dòng)時(shí)間 默認(rèn)0.1秒
/// - offset: 抖動(dòng)的偏移量 默認(rèn)2個(gè)點(diǎn)
/// - completion: 抖動(dòng)結(jié)束回調(diào)
public func shake(direction: ZHYShakeDirection = .horizontal, times: Int = 5, interval: TimeInterval = 0.1, offset: CGFloat = 2, completion: (() -> Void)? = nil) {
//移動(dòng)視圖動(dòng)畫(一次)
UIView.animate(withDuration: interval, animations: {
switch direction {
case .horizontal:
self.layer.setAffineTransform(CGAffineTransform(translationX: offset, y: 0))
case .vertical:
self.layer.setAffineTransform(CGAffineTransform(translationX: 0, y: offset))
}
}) { (complete) in
//如果當(dāng)前是最后一次抖動(dòng)凿试,則將位置還原,并調(diào)用完成回調(diào)函數(shù)
if (times == 0) {
UIView.animate(withDuration: interval, animations: {
self.layer.setAffineTransform(CGAffineTransform.identity)
}, completion: { (complete) in
completion?()
})
}
//如果當(dāng)前不是最后一次似芝,則繼續(xù)動(dòng)畫那婉,偏移位置相反
else {
self.shake(direction: direction, times: times - 1, interval: interval, offset: -offset, completion: completion)
}
}
}
}
- 全部都設(shè)置了默認(rèn)值,所以你可以這樣子調(diào)用的
//一個(gè)簡(jiǎn)單的調(diào)用党瓮,全部使用默認(rèn)值详炬,抖動(dòng)完成后不做任何操作
view.shake()
- 默認(rèn)是水平抖動(dòng),設(shè)置抖動(dòng)方向很簡(jiǎn)單的
//這樣就設(shè)置為垂直抖動(dòng)啦寞奸。呛谜。。
view.shake(direction: .vertical)
- 再粘一個(gè)完全的調(diào)用
label.shake(direction: .horizontal, times: 9, interval: 0.03, offset: 3) {
print("我抖完了蝇闭,該你了呻率。")
}
- (PS: 把interval調(diào)小點(diǎn)。呻引。。抖動(dòng)可帶勁了吐咳。逻悠。。)