Skip to content

Commit 66bc02b

Browse files
committed
Reuse cards instead of deleting and creating new ones.
1 parent 325a3cb commit 66bc02b

File tree

2 files changed

+37
-16
lines changed

2 files changed

+37
-16
lines changed

CardAnimation/AnimatedCardView/AnimatedCardsView.swift

+28-12
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import UIKit
1111
public protocol AnimatedCardsViewDataSource : class {
1212
func numberOfVisibleCards() -> Int
1313
func numberOfCards() -> Int
14-
func cardNumber(number:Int) -> BaseCardView
14+
func cardNumber(number:Int, view:BaseCardView?) -> BaseCardView
1515
}
1616

1717
public class AnimatedCardsView: UIView {
@@ -35,7 +35,8 @@ public class AnimatedCardsView: UIView {
3535
}
3636

3737
// MARK: Private properties
38-
private var cardArray : [UIView]! = []
38+
private var cardArray : [BaseCardView]! = []
39+
private var poolCardArray : [BaseCardView]! = []
3940
private lazy var gestureRecognizer : UIPanGestureRecognizer = {
4041
return UIPanGestureRecognizer(target: self, action: "scrollOnView:")
4142
}()
@@ -133,6 +134,7 @@ public class AnimatedCardsView: UIView {
133134
UIView.animateWithDuration(animationsSpeed*1.5, animations: {
134135
frontView.layer.transform = self.flipDownTransform3D
135136
}, completion: { _ in
137+
self.poolCardArray.append(frontView)
136138
frontView.removeFromSuperview()
137139
self.relayoutSubViewsAnimated(true)
138140
})
@@ -155,21 +157,34 @@ extension AnimatedCardsView {
155157
applyConstraintsToView(view)
156158
return view
157159
}
160+
poolCardArray = []
158161
}
159162

160163
private func addNewCardViewWithIndex(index:Int, insertOnRear rear:Bool = false) -> UIView {
161164
let newIndex = rear ? subviews.count : 0
162-
let newView = generateNewCardViewWithIndex(index)
163-
rear ? insertSubview(newView, atIndex: newIndex) : addSubview(newView)
164-
rear ? cardArray.append(newView) : cardArray.insert(newView, atIndex: newIndex)
165-
applyConstraintsToView(newView)
166-
relayoutSubView(newView, relativeIndex: newIndex, animated: false)
167-
newView.alpha = rear ? 0.0 : 1.0
168-
return newView
165+
var newView : BaseCardView?
166+
// Reuse cards
167+
if poolCardArray.count > 0 {
168+
let reusedView = poolCardArray.removeFirst()
169+
newView = generateNewCardViewWithIndex(index, reusingCardView: reusedView)
170+
} else {
171+
newView = generateNewCardViewWithIndex(index)
172+
}
173+
rear ? insertSubview(newView!, atIndex: newIndex) : addSubview(newView!)
174+
rear ? cardArray.append(newView!) : cardArray.insert(newView!, atIndex: newIndex)
175+
applyConstraintsToView(newView!)
176+
relayoutSubView(newView!, relativeIndex: newIndex, animated: false)
177+
newView!.alpha = rear ? 0.0 : 1.0
178+
return newView!
169179
}
170180

171-
private func generateNewCardViewWithIndex(index:Int) -> UIView {
172-
let view = self.dataSourceDelegate!.cardNumber(index)
181+
private func generateNewCardViewWithIndex(index:Int, reusingCardView cardView:BaseCardView? = nil) -> BaseCardView {
182+
// Reset card
183+
if cardView != nil {
184+
cardView!.layer.transform = flipUpTransform3D
185+
cardView!.removeConstraints(cardView!.constraints)
186+
}
187+
let view = self.dataSourceDelegate!.cardNumber(index, view: cardView)
173188
view.translatesAutoresizingMaskIntoConstraints = false
174189
return view
175190
}
@@ -190,7 +205,7 @@ extension AnimatedCardsView {
190205
// MARK: Handle Layout
191206
extension AnimatedCardsView {
192207

193-
private func relayoutSubView(subView:UIView, relativeIndex:Int, animated:Bool = true, delay: NSTimeInterval = 0, haveBorderWidth: Bool = true, fadeAndDelete delete: Bool = false) {
208+
private func relayoutSubView(subView:BaseCardView, relativeIndex:Int, animated:Bool = true, delay: NSTimeInterval = 0, haveBorderWidth: Bool = true, fadeAndDelete delete: Bool = false) {
194209
let width = Constants.DefaultSize.width
195210
subView.layer.anchorPoint = CGPointMake(0.5, 1)
196211
subView.layer.zPosition = CGFloat(1000 - relativeIndex)
@@ -219,6 +234,7 @@ extension AnimatedCardsView {
219234
self.layoutIfNeeded()
220235
}, completion: { _ in
221236
if delete {
237+
self.poolCardArray.append(subView)
222238
subView.removeFromSuperview()
223239
}
224240
})

CardAnimation/ComponentExampleViewController.swift

+9-4
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,16 @@ extension ComponentExampleViewController : AnimatedCardsViewDataSource {
6969
return 8
7070
}
7171

72-
func cardNumber(number:Int) -> BaseCardView {
72+
func cardNumber(number: Int, view: BaseCardView?) -> BaseCardView {
73+
var retView : ImageCardView? = view as? ImageCardView
7374
print(" 🃏 Requested card number \(number)")
74-
let view = ImageCardView(frame: CGRect(x: 0, y: 0, width: 10, height: 10))
75-
view.imageView.image = UIImage.init(named: JusticeLeagueLogos.logoArray[number].rawValue)
76-
return view
75+
if retView == nil {
76+
retView = ImageCardView(frame: CGRect(x: 0, y: 0, width: 10, height: 10))
77+
} else {
78+
print(" ✌️ View Cached ✌️ ")
79+
}
80+
retView!.imageView.image = UIImage.init(named: JusticeLeagueLogos.logoArray[number].rawValue)
81+
return retView!
7782
}
7883

7984
}

0 commit comments

Comments
 (0)