点击从原位置放大至整个屏幕
- 点击collectionview的cell时发出通知 并将自己本身和URL数组 和 indexPath 传递过去 在当前视图中提供计算 初始cell在屏幕中的frame 和 目标位置frame的两个方法
- 在父控制器中 接收通知 记录indexpath 记录collectionview(用以调用自身计算frame的方法)
- 创建一个图片对象 通过URL数组和indexpath 下载图片
- 在转场代理方法中 将图片加载到上下文的容器视图中
- 设置初始frame
- 在动画block中 设置目标frame
- 动画完成后 将图片对象从父视图(容器)中移除 将toView() 添加到容器视图
let toView = transitionContext.viewForKey(UITransitionContextToViewKey)!
图片视图只是起到一个中间过渡的作用 用完之后需要删除掉
核心代码
if isPresent {
let toView = transitionContext.viewForKey(UITransitionContextToViewKey)!
transitionContext.containerView()?.addSubview(presentPicView)
// toView.alpha = 0.0
let fromRect = pictureView?.cellScreenFrame(picIndexP!)
let toRect = pictureView?.cellDesFrame(picIndexP!)
presentPicView.frame = fromRect!
UIView.animateWithDuration(transitionDuration(transitionContext), animations: {
// toView.alpha = 1.0
self.presentPicView.frame = toRect!
}) { (_) in
self.presentPicView.removeFromSuperview()
transitionContext.containerView()?.addSubview(toView)
// 此方法必须实现(API 注明)
// 动画结束之后一定要执行,如果不执行,系统会一直等待,无法进行后续交互
transitionContext.completeTransition(true)
}
}