better logic for hide transitionView first when dismiss (feel better)

This commit is contained in:
nixzhu
2015-05-06 21:47:10 +08:00
parent 0a7f10f8f1
commit b2e211c7f7
2 changed files with 43 additions and 25 deletions
@@ -11,7 +11,14 @@ import UIKit
class ConversationMessagePreviewTransitionManager: NSObject, UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning {
var frame = CGRectZero
var transitionView: UIView?
var transitionView: UIView? {
didSet {
if let transitionView = transitionView {
transitionViewSnapshot = transitionView.snapshotViewAfterScreenUpdates(false)
}
}
}
var transitionViewSnapshot: UIView?
var isPresentation = false
@@ -66,9 +73,10 @@ class ConversationMessagePreviewTransitionManager: NSObject, UIViewControllerTra
let animatingVC = toVC!
let animatingView = toView!
if let transitionView = transitionView {
animatingView.addSubview(transitionView)
transitionView.frame = frame
if let transitionViewSnapshot = transitionViewSnapshot {
animatingView.addSubview(transitionViewSnapshot)
transitionViewSnapshot.frame = frame
animatingVC.view.backgroundColor = UIColor.clearColor()
animatingVC.mediaView.alpha = 0
@@ -82,28 +90,29 @@ class ConversationMessagePreviewTransitionManager: NSObject, UIViewControllerTra
})
UIView.addKeyframeWithRelativeStartTime(0.2, relativeDuration: 0.5, animations: { () -> Void in
transitionView.center = animatingView.center
transitionViewSnapshot.center = animatingView.center
})
UIView.addKeyframeWithRelativeStartTime(0.7, relativeDuration: 0.2, animations: { () -> Void in
let targetWidth = animatingView.bounds.width + self.largerOffset
let dw = targetWidth - transitionView.bounds.width
let ratio = targetWidth / transitionView.bounds.width
let height = ratio * transitionView.bounds.height
let dh = height - transitionView.bounds.height
let dw = targetWidth - transitionViewSnapshot.bounds.width
let ratio = targetWidth / transitionViewSnapshot.bounds.width
let height = ratio * transitionViewSnapshot.bounds.height
let dh = height - transitionViewSnapshot.bounds.height
let frame = CGRectInset(transitionView.frame, -dw * 0.5, -dh * 0.5)
let frame = CGRectInset(transitionViewSnapshot.frame, -dw * 0.5, -dh * 0.5)
transitionView.frame = frame
transitionViewSnapshot.frame = frame
})
UIView.addKeyframeWithRelativeStartTime(0.9, relativeDuration: 0.0, animations: { () -> Void in
let ratio = (animatingView.bounds.width + self.largerOffset) / animatingView.bounds.width
animatingVC.mediaView.transform = CGAffineTransformMakeScale(ratio, ratio)
animatingVC.mediaView.alpha = 1
transitionView.alpha = 0
transitionViewSnapshot.alpha = 0
})
UIView.addKeyframeWithRelativeStartTime(0.9, relativeDuration: 0.1, animations: { () -> Void in
@@ -111,7 +120,7 @@ class ConversationMessagePreviewTransitionManager: NSObject, UIViewControllerTra
})
}, completion: { (finished) -> Void in
transitionView.removeFromSuperview()
transitionViewSnapshot.removeFromSuperview()
transitionContext.completeTransition(true)
})
@@ -131,7 +140,11 @@ class ConversationMessagePreviewTransitionManager: NSObject, UIViewControllerTra
let fullDuration = transitionDuration(transitionContext)
if let transitionView = transitionView {
if let transitionViewSnapshot = transitionViewSnapshot {
if let transitionView = self.transitionView {
transitionView.alpha = 0
}
UIView.animateKeyframesWithDuration(fullDuration, delay: 0.0, options: .CalculationModeCubic, animations: { () -> Void in
@@ -141,15 +154,15 @@ class ConversationMessagePreviewTransitionManager: NSObject, UIViewControllerTra
})
UIView.addKeyframeWithRelativeStartTime(0.2, relativeDuration: 0.0, animations: { () -> Void in
animatingView.addSubview(transitionView)
transitionView.center = animatingView.center
transitionView.alpha = 1
animatingView.addSubview(transitionViewSnapshot)
transitionViewSnapshot.center = animatingView.center
transitionViewSnapshot.alpha = 1
animatingVC.mediaView.alpha = 0
})
UIView.addKeyframeWithRelativeStartTime(0.2, relativeDuration: 0.6, animations: { () -> Void in
transitionView.frame = self.frame
transitionViewSnapshot.frame = self.frame
})
UIView.addKeyframeWithRelativeStartTime(0.8, relativeDuration: 0.2, animations: { () -> Void in
@@ -157,7 +170,12 @@ class ConversationMessagePreviewTransitionManager: NSObject, UIViewControllerTra
})
}, completion: { (finished) -> Void in
transitionView.removeFromSuperview()
if let transitionView = self.transitionView {
transitionView.alpha = 1
}
transitionViewSnapshot.removeFromSuperview()
transitionContext.completeTransition(true)
})
@@ -918,17 +918,17 @@ class ConversationViewController: UIViewController {
case MessageMediaType.Image.rawValue:
let cell = cell as! ChatLeftImageCell
transitionView = cell.messageImageView.snapshotViewAfterScreenUpdates(false)
transitionView = cell.messageImageView
frame = cell.convertRect(cell.messageImageView.frame, toView: view)
case MessageMediaType.Video.rawValue:
let cell = cell as! ChatLeftVideoCell
transitionView = cell.thumbnailImageView.snapshotViewAfterScreenUpdates(false)
transitionView = cell.thumbnailImageView
frame = cell.convertRect(cell.thumbnailImageView.frame, toView: view)
case MessageMediaType.Location.rawValue:
let cell = cell as! ChatLeftLocationCell
transitionView = cell.mapImageView.snapshotViewAfterScreenUpdates(false)
transitionView = cell.mapImageView
frame = cell.convertRect(cell.mapImageView.frame, toView: view)
default:
@@ -940,17 +940,17 @@ class ConversationViewController: UIViewController {
case MessageMediaType.Image.rawValue:
let cell = cell as! ChatRightImageCell
transitionView = cell.messageImageView.snapshotViewAfterScreenUpdates(false)
transitionView = cell.messageImageView
frame = cell.convertRect(cell.messageImageView.frame, toView: view)
case MessageMediaType.Video.rawValue:
let cell = cell as! ChatRightVideoCell
transitionView = cell.thumbnailImageView.snapshotViewAfterScreenUpdates(false)
transitionView = cell.thumbnailImageView
frame = cell.convertRect(cell.thumbnailImageView.frame, toView: view)
case MessageMediaType.Location.rawValue:
let cell = cell as! ChatRightLocationCell
transitionView = cell.mapImageView.snapshotViewAfterScreenUpdates(false)
transitionView = cell.mapImageView
frame = cell.convertRect(cell.mapImageView.frame, toView: view)
default: