实现一个完美的自定义 Share Extension 呈现动画

图拉鼎 2018-04-13 15:30

在 iOS App 里,如果你实现过一个 Share Extension,可能会使用系统自带的 SLComposeServiceViewController 来完成分享动作。不过这个东西自定义性比较差,而且无法汇报错误、展现进度等待,这时会使用自定义 ViewController。

不过在使用自定义 ViewController 时,你又会发现在呈现的动画效果又没有系统的自然,很生硬(参考微信和微博的分享菜单出来的那个效果,不完美)。那么如何做一个完美的分享界面的呈现过程呢?我终于在 Telegram 那找到了答案。

在使用 Telegram 的过程中,我早就发现它使用起来是非常流畅,而且自带的分享界面和系统原生的分享的呈现动画几乎一模一样。今天我花了几分钟找到了答案,原来 Telegram 使用了一个魔法数字。

先上我修改后的 Swift 源码,使用方法很简单,把这个作为你自定义的 UIViewController 的 NavigationController,这样分享界面出来的动画就会非常自然了。

class ShareNavigationController: UINavigationController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        self.view.transform = CGAffineTransform(translationX: 0, y: self.view.frame.size.height)

        UIView.animate(withDuration: 0.3, delay: 0, options: UIViewAnimationOptions(rawValue: 7 << 16 | UIViewAnimationOptions.allowAnimatedContent.rawValue), animations: {
            self.view.transform = .identity
        }, completion: nil)
    }

}

它的核心代码是在 UIView.animate 的 options 里,传入了这个魔法选项:

UIViewAnimationOptions(rawValue: 7 << 16 | UIViewAnimationOptions.allowAnimatedContent.rawValue)

通过使用这个魔法 Options, ViewController 呈现的动画效果就和系统自带的一模一样了。作为对比,你可以试试其他参数。这里就不上截图或者动画了。

源码参考来自 Telegram 项目:https://github.com/peter-iakovlev/Telegram/blob/public/Share/TGShareController.m#L662

本站架设于Linode 东京机房

[返回] [原文链接]