【问题标题】:Can't make custom segue in Xcode 10/iOS 12无法在 Xcode 10/iOS 12 中进行自定义 segue
【发布时间】: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


【解决方案1】:

您可以使用Container View 作为您的抽屉,而不是使用自定义演示文稿segue。这样,您可以将 UIViewController 用于 Drawer 内容,同时避免自定义 segue 的问题。

您可以通过两个步骤实现此目的: 首先将 Container View 拉入主视图控制器并正确布局。情节提要如下所示:(您可以看到您有两个视图控制器。一个用于主视图,一个用于抽屉)

其次,您创建一个动作,根据需要为抽屉进出动画。一个简单的例子可能如下所示:

@IBAction func toggleDrawer(_ sender: Any) {
    let newHeight: CGFloat
    if drawerHeightConstraint.constant > 0 {
        newHeight = 0
    } else {
        newHeight = 200
    }

    UIView.animate(withDuration: 1) {
        self.drawerHeightConstraint.constant = newHeight
        self.view.layoutIfNeeded()
    }
}

在这里,我只是改变了抽屉的高度限制,将其滑入和滑出。当然你可以做一些更花哨的事情:)

你可以找到一个演示项目here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 2013-10-15
    • 2018-11-14
    • 1970-01-01
    • 2012-05-28
    相关资源
    最近更新 更多