【发布时间】:2019-04-16 03:26:11
【问题描述】:
我很难在 iPhone 的屏幕上实现抽屉滑到一半的演示。
编辑:我发现 iOS 不尊重我在 Segue 中设置的 .custom modalTransitionStyle。如果我在prepareForSegue: 中明确设置,那么它会调用我的委托来获取UIPresentationController。
我有一个自定义 Segue,它也是一个 UIViewControllerTransitioningDelegate。在perform() 方法中,我将目标transitioningDelegate 设置为self:
self.destination.transitioningDelegate = self
我要么调用 super.perform()(如果它是 Present Modal 或 Present as Popover Segue),要么调用 self.source.present(self.destination, animated: true)(如果它是自定义 Segue,因为调用 super.perform() 会引发异常)。
perform() 和 animationController(…) 方法被调用,但从未被调用 presentationController(forPresented…)。
最初,我尝试使用我的自定义 Segue 类在 Storyboard“呈现模态”中制作 Segue,但这会一直删除呈现视图控制器。我尝试了“Present as Popover”,我发誓它工作过一次,因为它没有删除呈现视图控制器,但在随后的尝试中它仍然有效。
所以我将其设为“自定义”,而 perform() 仍被调用,并在目标视图控制器上预设了 _UIFullscreenPresentationController,而我的 presentationController(forPresented…) 方法从未被调用。
处理此问题的其他解决方案始终取决于该方法的一些错误写入的签名。这是我的,逐字逐句:
public func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController?
在过去的四天里,我一直在试图找出“正确”的自定义过渡,但事情似乎不像宣传的那样表现得淋漓尽致。我错过了什么?
【问题讨论】:
-
嗨 Rick,我很难弄清楚您的自定义转换是如何出错的。您可以发布自定义转换的代码或将链接附加到最小的测试示例吗?此外,我假设您使用的是两个标准 ViewController,不涉及 NavigationController。我说的对吗?
-
呈现视图控制器位于 UINavigationController 内(它是唯一的一个)。我目前无法发布代码,但会在今天晚些时候发布。
-
再次阅读您的问题后,我假设您想要一个覆盖当前视图的抽屉,类似于 Apple Maps 中的抽屉。据我所知,您不应该使用视图控制器来执行此操作,因为在 iOS 上只能同时显示一个 ViewController,而是使用 UIView。
-
我认为这不是真的。您可以在 iPhone 上使用拆分视图控制器,我在 WWDC 视频中看到了一个示例,它们在 iPhone 上制作了一个弹出框。
-
嗯,我得重新检查一下,但是如果使用 UIView 而不是单独的 ViewController 对你来说也可以,这里有一个很好的教程,展示了如何在 iOS 上实现抽屉:@987654321 @
标签: ios custom-transition