图片展示、隐藏转场动画

通过UIViewControllerAnimatedTransitioning实现图片的转场动画,效果类似手机自带的照片查看器。详细过程如下:
先看看效果:


QQ20180507-223238-HD.gif

首先造一个ShowImageController控制器

class ShowImageController: UIViewController {

}

那么它能做什么,首先要能展示图片,给它一个UIImageView

class ShowImageController: UIViewController {
/// 图像视图
    private lazy var imageView: UIImageView = {
        let iv = UIImageView()
        
        return iv
    }()
}
    

其次,它还要支持缩放,给它一个UIScrollView

class ShowImageController: UIViewController {
    /// 图像视图
    private lazy var imageView: UIImageView = {
        let iv = UIImageView()
        
        return iv
    }()
    /// 滚动视图
    private lazy var scrollView: UIScrollView = {
        let s = UIScrollView(frame: self.view.bounds)
        s.backgroundColor = UIColor.black
        // 支持缩放
        // 1. 设置代理
        s.delegate = self
        // 2. 最小大缩放比例
        s.minimumZoomScale = 1
        s.maximumZoomScale = 2.0
        
        return s
    }()
}

添加一个构造方法

  • 捕捉一个屏幕快照dummyView
  • 设置transitioningDelegate
init(sourceView:UIImageView) {
    super.init(nibName: nil, bundle: nil)
    
    self.setImage(image: sourceView.image)
    let window = UIApplication.shared.keyWindow
    self.showPicDelegate.dummyView = sourceView.snapshotView(afterScreenUpdates: false)
    self.showPicDelegate.sourceRect = sourceView.convert(sourceView.bounds, to: window)
    self.showPicDelegate.destRect = imageSize(sourceView.image!)
    self.transitioningDelegate = self.showPicDelegate
    modalPresentationStyle = UIModalPresentationStyle.custom
}

然后实现transitioningDelegate,新建ShowPicAnimator类,添加属性

class ShowPicAnimator: NSObject, UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning {
    ///是开始还是结束
    var isPresent: Bool = true
    ///快照
    var dummyView: UIView?
    ///起始位置
    var sourceRect: CGRect = CGRect.zero
    ///结束位置
    var destRect: CGRect = CGRect.zero
}

添加代理方法

// 指定谁负责转场动画
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
    isPresent = true
    return self
}
func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
    isPresent = false
    return self
}
//UIViewControllerAnimatedTransitioning
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
    return 0.3
}
/* self实现动画
1. 计算动画的起始位置
2. 计算动画的目标位置
*/
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
}

具体实现细节见代码

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 用到的组件 1、通过CocoaPods安装 2、第三方类库安装 3、第三方服务 友盟社会化分享组件 友盟用户反馈 ...
    SunnyLeong阅读 14,958评论 1 180
  • 概述 这篇文章,我将讲述几种转场动画的自定义方式,并且每种方式附上一个示例,毕竟代码才是我们的语言,这样比较容易上...
    伯恩的遗产阅读 54,238评论 37 381
  • 潮湿的阴雨天总是会让人的心情有些down,也许这真适合今天的课程,激活高效员工。要想马儿跑,要让马儿先吃草,蛮形象...
    刘扬_ca83阅读 1,300评论 0 0
  • 陪儿子跑步的时候,也经常遇到其他父子俩在那里走圈,老子谈论的话题也总离不开当年多么能跑,什么跑完3000米,休息一...
    512song阅读 748评论 0 0
  • 今天上午熬了一锅鸡汤来喝,最近这段时间吃得太不健康了,就想着煮点东西补一补。这应该是我半年以来喝的第一碗鸡汤了吧,...
    钤鱼摆摆阅读 825评论 1 1