Ios 静态表视图动画
我最近一直在努力复制一个动画,但是尽管进行了所有的测试和研究,我还是找不到一个合适的解决方案来处理这种动画 我已经制作了一个我正在谈论的动画的GIF(取自“Captain Train”iOS应用程序): 基本上,它所做的是用各种视图替换tableView,并且非常漂亮地设置导航栏项目的动画 到目前为止我所做的: 我通过创建如下类创建了一个自定义转换控制器:Ios 静态表视图动画,ios,swift,uitableview,animation,Ios,Swift,Uitableview,Animation,我最近一直在努力复制一个动画,但是尽管进行了所有的测试和研究,我还是找不到一个合适的解决方案来处理这种动画 我已经制作了一个我正在谈论的动画的GIF(取自“Captain Train”iOS应用程序): 基本上,它所做的是用各种视图替换tableView,并且非常漂亮地设置导航栏项目的动画 到目前为止我所做的: 我通过创建如下类创建了一个自定义转换控制器: class TransitionManager: NSObject, UIViewControllerAnimatedTransitioni
class TransitionManager: NSObject, UIViewControllerAnimatedTransitioning, UIViewControllerTransitioningDelegate {
// MARK: UIViewControllerAnimatedTransitioning protocol methods
var openingFrame: CGRect?
func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)!
let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!
if let containerView = transitionContext.containerView() {
let animationDuration = self .transitionDuration(transitionContext)
let snapshotView = toViewController.view.resizableSnapshotViewFromRect(toViewController.view.frame, afterScreenUpdates: true, withCapInsets: UIEdgeInsetsZero)
snapshotView.frame = openingFrame!
containerView.addSubview(snapshotView)
toViewController.view.alpha = 0.0
containerView.addSubview(toViewController.view)
UIView.animateWithDuration(animationDuration, delay: 0.0, usingSpringWithDamping: 0.9, initialSpringVelocity: 1.0, options: .TransitionNone,
animations: { () -> Void in
snapshotView.frame = fromViewController.view.frame
}, completion: { (finished) -> Void in
snapshotView.removeFromSuperview()
toViewController.view.alpha = 1.0
transitionContext.completeTransition(finished)
})
}
}
// return how many seconds the transiton animation will take
func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
return 0.45
}
// MARK: UIViewControllerTransitioningDelegate protocol methods
func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return self
}
// return the animator used when dismissing from a viewcontroller
func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return self
}
}
这种转换是有效的,我可以点击一个表视图项目,并进行动画转换到另一个,使我的新视图符合单元格的边界,然后全屏显示
用户单击单元格时触发的函数如下所示:
func presentDetailViewAnimated() {
let transitionManager = TransitionManager()
transitionManager.openingFrame = placeTableViewCell.frame
let controller = self.storyboard?.instantiateViewControllerWithIdentifier("testAnimation")
controller?.transitioningDelegate = transitionManager
self.presentViewController(controller!, animated: true, completion: nil)
}
这很好,但它会替换视图。我正在寻找的动画发生在tableView中,以某种方式替换了内容,这就是我丢失的地方
我对IOS动画不是很有经验,所以我不知道从哪里开始才能达到这样的效果。我甚至不知道这个视图真的是一个表视图,或者如果他们只是伪造它,所有的事情都是以自定义的方式处理的
我希望我的帖子足够清晰,如有任何意见/想法,将不胜感激。:) 显示动画的代码。如果不放慢速度,就很难准确地看到发生了什么,但我会从点击tableviewCell的大小开始。拍摄目标控制器的快照,并将其缩小到单元格的帧中,然后将其添加到transitionContext containerView中,然后在uiview动画块中,将其扩展到全尺寸。正如我所说,这是一个快速浏览的方法。@MDB983我添加了完整的类,但我认为我所做的根本不是一个好的解决方案。事实上,当我把它转换成GIF时,我看到了所有的图片,我可以清楚地看到更多的动画,而不仅仅是一个矩形。比如表格视图单元格被推开之类的。我不认为这是另一个视图,我只是意识到它很可能是一个容器视图,带有交叉溶解等过渡动画。快照视图是目标控制器,alpha设置为0。你所看到的只是逐渐消失的目的地视图。您需要获取TableViewCell的框架。将框架应用于快照视图,并转换为containerView坐标系。这将使destinationViewController完全覆盖在tableViewCell上。在动画块中,将快照视图的帧设置为destinationViewControler的帧。这将从tableViewCell开始,将快照扩展到全尺寸,给人的印象是快照从tableViewCell“增长”。