在 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