import UIKit
protocol Shakeable {}
extension Shakeable where Self: UIView {
func shake() {
let animation = CABasicAnimation(keyPath: "position")
animation.duration = 0.5
animation.repeatCount = 5
animation.autoreverses = true
animation.fromValue = NSValue(cgPoint: CGPoint(x: self.center.x - 4 , y: self.center.y))
animation.toValue = NSValue(cgPoint: CGPoint(x: self.center.x + 4, y: self.center.y))
layer.add(animation, forKey: "position")
print("Shaked!")
}
}
然后我有一个自定义单元格的模型我在哪里实现这个协议。然后我在控制器中调用func
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "TacoCell", for: indexPath) as? TacoCell {
cell.shake()
}
}
我是编码的新手,所以请原谅我提出这个问题的坏方法。
答案 0 :(得分:2)
这是你的问题:
if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "TacoCell", for: indexPath) as? TacoCell {
您正在将新单元格出列,而不是抓住已存在的单元格。
您应该使用cellForItem(at:)
- 这将获取已存在的单元格的实例。
e.g。
if let cell = cellForItem(at: indexPath) as? TacoCell {
cell.shake()
}