@@ -11,7 +11,7 @@ import UIKit
11
11
public protocol AnimatedCardsViewDataSource : class {
12
12
func numberOfVisibleCards( ) -> Int
13
13
func numberOfCards( ) -> Int
14
- func cardNumber( number: Int ) -> BaseCardView
14
+ func cardNumber( number: Int , view : BaseCardView ? ) -> BaseCardView
15
15
}
16
16
17
17
public class AnimatedCardsView : UIView {
@@ -35,7 +35,8 @@ public class AnimatedCardsView: UIView {
35
35
}
36
36
37
37
// MARK: Private properties
38
- private var cardArray : [ UIView ] ! = [ ]
38
+ private var cardArray : [ BaseCardView ] ! = [ ]
39
+ private var poolCardArray : [ BaseCardView ] ! = [ ]
39
40
private lazy var gestureRecognizer : UIPanGestureRecognizer = {
40
41
return UIPanGestureRecognizer ( target: self , action: " scrollOnView: " )
41
42
} ( )
@@ -133,6 +134,7 @@ public class AnimatedCardsView: UIView {
133
134
UIView . animateWithDuration ( animationsSpeed*1. 5 , animations: {
134
135
frontView. layer. transform = self . flipDownTransform3D
135
136
} , completion: { _ in
137
+ self . poolCardArray. append ( frontView)
136
138
frontView. removeFromSuperview ( )
137
139
self . relayoutSubViewsAnimated ( true )
138
140
} )
@@ -155,21 +157,34 @@ extension AnimatedCardsView {
155
157
applyConstraintsToView ( view)
156
158
return view
157
159
}
160
+ poolCardArray = [ ]
158
161
}
159
162
160
163
private func addNewCardViewWithIndex( index: Int , insertOnRear rear: Bool = false ) -> UIView {
161
164
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!
169
179
}
170
180
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)
173
188
view. translatesAutoresizingMaskIntoConstraints = false
174
189
return view
175
190
}
@@ -190,7 +205,7 @@ extension AnimatedCardsView {
190
205
// MARK: Handle Layout
191
206
extension AnimatedCardsView {
192
207
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 ) {
194
209
let width = Constants . DefaultSize. width
195
210
subView. layer. anchorPoint = CGPointMake ( 0.5 , 1 )
196
211
subView. layer. zPosition = CGFloat ( 1000 - relativeIndex)
@@ -219,6 +234,7 @@ extension AnimatedCardsView {
219
234
self . layoutIfNeeded ( )
220
235
} , completion: { _ in
221
236
if delete {
237
+ self . poolCardArray. append ( subView)
222
238
subView. removeFromSuperview ( )
223
239
}
224
240
} )
0 commit comments