Explorar o código

feat: 礼物面板增加选中时的跳动动画

陈文艺 hai 19 horas
pai
achega
ec7d6cade1

+ 30 - 2
Lanu/Views/Room/Gift/List/LNRoomGiftItemCell.swift

@@ -15,6 +15,11 @@ class LNRoomGiftItemCell: UICollectionViewCell {
     private let iconView = UIImageView()
     private let nameLabel = UILabel()
     private let priceLabel = UILabel()
+    override var isSelected: Bool {
+        didSet {
+            selectionBackground.isHidden = !isSelected
+        }
+    }
     
     override init(frame: CGRect) {
         super.init(frame: frame)
@@ -22,7 +27,7 @@ class LNRoomGiftItemCell: UICollectionViewCell {
         setupViews()
     }
     
-    func update(_ item: LNGiftItemVO, selected: Bool) {
+    func update(_ item: LNGiftItemVO) {
         guard let res = LNGiftManager.shared.resource(for: item.resId) else {
             isHidden = true
             return
@@ -31,8 +36,31 @@ class LNRoomGiftItemCell: UICollectionViewCell {
         nameLabel.text = res.curName
         priceLabel.text = item.value.currencyDisplay
         iconView.sd_setImage(with: URL(string: res.icon))
+    }
+    
+    func showJumpAnimate() {
+        iconView.layer.removeAllAnimations()
+        iconView.transform = .identity
+        
+        let totalDuration: TimeInterval = 1.0
+        let firstJumpHeight: CGFloat = 8.0
+        let secondJumpHeight: CGFloat = 6.0
         
-        selectionBackground.isHidden = !selected
+        let perTime = totalDuration / 4.0
+        UIView.animateKeyframes(withDuration: totalDuration, delay: 0, options: [.calculationModeCubic], animations: {
+            UIView.addKeyframe(withRelativeStartTime: 0.0, relativeDuration: perTime) {
+                self.iconView.transform = CGAffineTransform(translationX: 0, y: -firstJumpHeight)
+            }
+            UIView.addKeyframe(withRelativeStartTime: perTime, relativeDuration: perTime) {
+                self.iconView.transform = .identity
+            }
+            UIView.addKeyframe(withRelativeStartTime: 2 * perTime, relativeDuration: perTime) {
+                self.iconView.transform = CGAffineTransform(translationX: 0, y: -secondJumpHeight)
+            }
+            UIView.addKeyframe(withRelativeStartTime: 3 * perTime, relativeDuration: perTime) {
+                self.iconView.transform = .identity
+            }
+        })
     }
     
     required init?(coder: NSCoder) {

+ 7 - 5
Lanu/Views/Room/Gift/List/LNRoomGiftListView.swift

@@ -62,18 +62,20 @@ extension LNRoomGiftListView: UICollectionViewDataSource, UICollectionViewDelega
     
     func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
         let cell = collectionView.dequeueReusableCell(withReuseIdentifier: LNRoomGiftItemCell.className, for: indexPath) as! LNRoomGiftItemCell
-        cell.update(giftList[indexPath.item], selected: selectedIndex == indexPath.item)
+        cell.update(giftList[indexPath.item])
+        cell.isSelected = selectedIndex == indexPath.item
         return cell
     }
     
     func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
-        var indexs: [IndexPath] = []
+        if selectedIndex == indexPath.item { return }
+        
         if let selectedIndex {
-            indexs.append(.init(item: selectedIndex, section: 0))
+            collectionView.cellForItem(at: .init(row: selectedIndex, section: 0))?.isSelected = false
         }
         selectedIndex = indexPath.item
-        indexs.append(.init(indexes: indexPath))
-        collectionView.reloadItems(at: indexs)
+        collectionView.cellForItem(at: indexPath)?.isSelected = true
+        (collectionView.cellForItem(at: indexPath) as? LNRoomGiftItemCell)?.showJumpAnimate()
         
         delegate?.onRoomGiftListView(self, didSelect: indexPath.item)
     }