Skip to content

Commit dfe6e75

Browse files
committed
Added PanGesture back... fix border stuff pending.
1 parent d6fef93 commit dfe6e75

File tree

2 files changed

+155
-4
lines changed

2 files changed

+155
-4
lines changed

CardAnimation/AnimatedCardView/AnimatedCardsView.swift

+138-2
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ public class AnimatedCardsView: UIView {
6868
private var cardCount = PrivateConstants.cardCount
6969
private var maxVisibleCardCount = PrivateConstants.maxVisibleCardCount
7070
private var gestureDirection:panScrollDirection = .Up
71+
private var gestureTempCard: BaseCardView?
7172

7273
private var currentIndex = 0
7374

@@ -159,7 +160,7 @@ public class AnimatedCardsView: UIView {
159160
- returns: if the action was performed or not (out of bounds)
160161
*/
161162
public func flipDown() -> Bool {
162-
guard currentIndex < cardCount && cardArray.count > 0 else {
163+
guard currentIndex < cardCount else {
163164
return false
164165
}
165166

@@ -183,6 +184,140 @@ public class AnimatedCardsView: UIView {
183184
}
184185
}
185186

187+
// MARK: Pan gesture
188+
extension AnimatedCardsView {
189+
@objc private func scrollOnView(gesture: UIPanGestureRecognizer) {
190+
let velocity = gesture.velocityInView(self)
191+
let percent = gesture.translationInView(self).y/150
192+
var flipTransform3D = CATransform3DIdentity
193+
flipTransform3D.m34 = -1.0 / 1000.0
194+
195+
switch gesture.state{
196+
case .Began:
197+
198+
gestureDirection = velocity.y > 0 ? .Down : .Up
199+
200+
case .Changed:
201+
let frontView : BaseCardView? = cardArray.count > 0 ? cardArray[0] : nil
202+
203+
if gestureDirection == .Down{ // Flip down
204+
guard currentIndex < cardCount else {
205+
gesture.enabled = false // Cancel gesture
206+
return
207+
}
208+
209+
switch percent{
210+
case 0.0..<1.0:
211+
flipTransform3D = CATransform3DRotate(flipTransform3D, CGFloat(-M_PI) * percent, 1, 0, 0)
212+
frontView?.layer.transform = flipTransform3D
213+
if percent >= 0.5{
214+
frontView?.contentVisible(false)
215+
}else{
216+
frontView?.contentVisible(true)
217+
}
218+
case 1.0...CGFloat(MAXFLOAT):
219+
flipTransform3D = CATransform3DRotate(flipTransform3D, CGFloat(-M_PI), 1, 0, 0)
220+
frontView?.layer.transform = flipTransform3D
221+
default:
222+
print(percent)
223+
}
224+
225+
} else { // Flip up
226+
guard currentIndex > 0 else {
227+
gesture.enabled = false // Cancel gesture
228+
return
229+
}
230+
231+
if gestureTempCard == nil {
232+
let newView = addNewCardViewWithIndex(currentIndex-1)
233+
newView.layer.transform = flipDownTransform3D
234+
gestureTempCard = newView
235+
}
236+
237+
switch percent{
238+
case CGFloat(-MAXFLOAT)...(-1.0):
239+
gestureTempCard!.layer.transform = CATransform3DIdentity
240+
case -1.0...0:
241+
if percent <= -0.5{
242+
gestureTempCard!.contentVisible(true)
243+
gestureTempCard!.layer.borderWidth = gestureTempCard!.frame.width / 100
244+
}else{
245+
gestureTempCard!.contentVisible(false)
246+
gestureTempCard!.layer.borderWidth = 0
247+
}
248+
flipTransform3D = CATransform3DRotate(flipTransform3D, CGFloat(-M_PI) * (percent+1.0), 1, 0, 0)
249+
gestureTempCard!.layer.transform = flipTransform3D
250+
default:
251+
print(percent)
252+
}
253+
}
254+
255+
case .Ended:
256+
257+
switch gestureDirection{
258+
case .Down:
259+
if percent >= 0.5{
260+
currentIndex++
261+
262+
let frontView = cardArray.removeFirst()
263+
let lastIndex = currentIndex + cardArray.count
264+
if lastIndex < cardCount {
265+
addNewCardViewWithIndex(lastIndex, insertOnRear: true)
266+
}
267+
268+
flipTransform3D = CATransform3DRotate(flipTransform3D, CGFloat(M_PI), 1, 0, 0)
269+
UIView.animateWithDuration(0.3, animations: {
270+
frontView.layer.transform = flipTransform3D
271+
}, completion: {
272+
_ in
273+
self.poolCardArray.append(frontView)
274+
frontView.removeFromSuperview()
275+
self.relayoutSubViewsAnimated(true)
276+
277+
})
278+
}else{
279+
let frontView : BaseCardView? = cardArray.count > 0 ? cardArray[0] : nil
280+
UIView.animateWithDuration(0.2, animations: {
281+
frontView?.layer.transform = CATransform3DIdentity
282+
})
283+
284+
}
285+
286+
case .Up:
287+
guard currentIndex > 0 else {
288+
return
289+
}
290+
291+
if percent <= -0.5{
292+
currentIndex--
293+
let shouldRemoveLast = cardArray.count > maxVisibleCardCount
294+
UIView.animateWithDuration(0.2, animations: {
295+
self.gestureTempCard!.layer.transform = CATransform3DIdentity
296+
}, completion: {
297+
_ in
298+
self.relayoutSubViewsAnimated(true, removeLast: shouldRemoveLast)
299+
self.gestureTempCard = nil
300+
})
301+
}else{
302+
UIView.animateWithDuration(0.2, animations: {
303+
self.gestureTempCard!.layer.transform = CATransform3DRotate(flipTransform3D, CGFloat(-M_PI), 1, 0, 0)
304+
}, completion: {
305+
_ in
306+
self.poolCardArray.append(self.gestureTempCard!)
307+
self.cardArray.removeFirst()
308+
self.gestureTempCard!.removeFromSuperview()
309+
self.gestureTempCard = nil
310+
})
311+
}
312+
}
313+
case .Cancelled: // When cancel reenable gesture
314+
gesture.enabled = true
315+
default:
316+
print("DEFAULT: DO NOTHING")
317+
}
318+
}
319+
}
320+
186321
// MARK: Card Generation
187322
extension AnimatedCardsView {
188323
private func generateCards() {
@@ -202,7 +337,7 @@ extension AnimatedCardsView {
202337
poolCardArray = []
203338
}
204339

205-
private func addNewCardViewWithIndex(index:Int, insertOnRear rear:Bool = false) -> UIView {
340+
private func addNewCardViewWithIndex(index:Int, insertOnRear rear:Bool = false) -> BaseCardView {
206341
let newIndex = rear ? subviews.count : 0
207342
var newView : BaseCardView?
208343
// Reuse cards
@@ -225,6 +360,7 @@ extension AnimatedCardsView {
225360
if cardView != nil {
226361
cardView!.layer.transform = flipUpTransform3D
227362
cardView!.removeConstraints(cardView!.constraints)
363+
cardView!.prepareForReuse()
228364
}
229365
let view = self.dataSourceDelegate!.cardNumber(index, reusedView: cardView)
230366
view.translatesAutoresizingMaskIntoConstraints = false

CardAnimation/AnimatedCardView/CardViews.swift

+17-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,14 @@
88

99
import UIKit
1010

11-
public class BaseCardView: UIView {
11+
protocol CardView {
12+
func contentVisible(visible:Bool)
13+
func prepareForReuse()
14+
}
1215

16+
public class BaseCardView: UIView, CardView {
17+
func contentVisible(visible:Bool) { }
18+
func prepareForReuse() { }
1319
}
1420

1521
public class ImageCardView: BaseCardView {
@@ -25,11 +31,20 @@ public class ImageCardView: BaseCardView {
2531
}
2632

2733
private func configure() {
28-
imageView = UIImageView.init(frame: frame)
34+
backgroundColor = UIColor.darkGrayColor()
35+
imageView = UIImageView(frame: frame)
2936
imageView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
3037
imageView.backgroundColor = UIColor.lightGrayColor()
3138
imageView.clipsToBounds = true
3239
imageView.contentMode = .ScaleAspectFill
3340
addSubview(imageView)
3441
}
42+
43+
override func contentVisible(visible:Bool) {
44+
imageView.hidden = !visible
45+
}
46+
47+
override func prepareForReuse() {
48+
imageView.hidden = false
49+
}
3550
}

0 commit comments

Comments
 (0)