这里是针对朋友提出如何写代理的疑问,发现自己的文章丝毫没有提到这个,在这里做出一个补充
如何写协议
/// 设置呈现的转场动画的代理
protocol AnimatorPresentedDelegate : NSObjectProtocol{
/// 开始位置
func startRect(indexPath:IndexPath) -> CGRect
/// 结束位置
func endRect(indexPath:IndexPath) -> CGRect
/// 需要呈现的图片控件
func imageView(indexPath:IndexPath) -> UIImageView
}
定义代理
var presentedDelegate : AnimatorPresentedDelegate?
其中一部分的调用代理方法
func animationForPresentedView(transitionContext: UIViewControllerContextTransitioning){
//用可选绑定进行代理和indexPath 的nil值校验
guard let presentedDelegate = presentedDelegate,let indexPath = indexPath else {
return;
}
//取出弹出的view -- 强制解包
let presentedView = transitionContext.view(forKey:.to)!;
//将presentedView添加到containerView中
transitionContext.containerView.addSubview(presentedView);
//获取执行动画的imageView,和开始坐标
let startRect = presentedDelegate.startRect(indexPath: indexPath);
let imageView = presentedDelegate.imageView(indexPath: indexPath);
//把imageView加到转场上下文里面
transitionContext.containerView.addSubview(imageView);
//设置尺寸--也就是开始的位置的尺寸
imageView.frame = startRect;
//执行动画(目的:特殊渐变动画) -- 由透明到不透明
presentedView.alpha = 0.0;
//设置containerView为黑色 -- 为了刚开始是看得到微博界面的BUG
transitionContext.containerView.backgroundColor = UIColor.black;
UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: {
//presentedView.alpha = 1.0;
//动画过程中走到结束的坐标
imageView.frame = presentedDelegate.endRect(indexPath: indexPath);
}) { (_) in
//针对图片模糊的BUG
imageView.removeFromSuperview();
//这个是防止重复的BUG
presentedView.alpha = 1.0;
transitionContext.completeTransition(true);
//执行完之后要还原
transitionContext.containerView.backgroundColor = UIColor.clear;
}
}