使用没有 Storyboard Segues 的 UIViewControllerAnimatedTransitioning
Posted
技术标签:
【中文标题】使用没有 Storyboard Segues 的 UIViewControllerAnimatedTransitioning【英文标题】:Using UIViewControllerAnimatedTransitioning Without Storyboard Segues 【发布时间】:2017-05-07 05:31:14 【问题描述】:我一直在尝试创建自定义转场转场,并一直在关注在线教程来帮助我。我在没有 Storyboard 的情况下以编程方式创建我的应用程序。
我有一个集合视图单元格,当我点击它时,我想要一个自定义动画过渡。当前的所有教程都使用 Storyboard segues。大多数教程将在情节提要上创建自定义转场,然后使用以下函数的一些变体来调用他们的自定义转场:
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
let vc = segue.destination as! ViewController
let cell = sender as! PictureCell
sourceCell = cell
vc.picture = cell.picture.image
因为我没有使用故事板,所以我认为我必须在 didselectitem 函数中调用我的动画过渡:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
我拥有所有自定义协议,并设置了我的 UINaviationDelegate 以包含自定义动画过渡:
extension FeedViewController: UINavigationControllerDelegate
func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning?
return PopInAndOutAnimator(operation: operation)
extension FeedViewController: CollectionPushAndPoppable
var collectionView: UICollectionView?
return ideasCollectionView
这是我学习的教程示例:http://www.stefanovettor.com/2015/12/25/uicollectionview-custom-transition-pop-in-and-out/
如何在没有情节提要的情况下调用我的自定义转场?
非常感谢您的帮助。在过去的一周里,我一直在试图解决这个问题。
谢谢
【问题讨论】:
据我所知,必须在情节提要中构建 segue,您还可以向它们提供标识符,您可以使用它来区分 segue。但我更喜欢使用 UINavigationController 而不是 Segue 处理它使用起来太方便了。 【参考方案1】:正如您正确指出的,只有在使用情节提要时才能使用 Segue,因此准备 segue 不适用于 xibs
您已经创建并设置了UINavigationControllerDelegate
,现在只想启动动画到另一个视图控制器。
因此,您只需在导航视图控制器上调用 push:
let vc = DetailViewController(nibName: "DetailViewController", bundle: nil)
self.navigationController.pushViewController(vc, animated: true)
此代码创建并显示DetailViewController
的实例(重命名为您使用的正确名称)。如果您正确设置导航视图控制器的委托,您的自定义动画将被应用。
【讨论】:
嗨@nef10 我已经尝试过了,但我不断收到以下错误:原因:'无法在捆绑中加载NIB:'NSBundle。我还有什么需要做的吗?我是否必须创建一个 nib 文件或更改某种设置? 你是如何定义你的 DetailViewController 的(不管你如何命名它)。如果你有一个 xib (=nib),那么代码应该可以工作。如果布局只在代码中完成,则需要使用普通的 init 方法。 如果您不使用 prepareForSegue 方法,您在哪里以及如何设置委托?以上是关于使用没有 Storyboard Segues 的 UIViewControllerAnimatedTransitioning的主要内容,如果未能解决你的问题,请参考以下文章
不使用 Storyboard segues 的自定义视图转换 (Swift)
Xcode 6 中 Mac OS 应用程序的 Storyboard segues
为presentViewController设置委托(例如不使用segues)