无法在Xcode 10 / iOS 12中进行自定义搜索

时间:2018-11-13 10:10:21

标签: ios custom-transition

在iPhone的屏幕上实现抽屉滑动的过程中,我遇到了最大的困难。

编辑:我发现iOS不尊重我在Segue中设置的.custom modalTransitionStyle。如果我在prepareForSegue:中进行了明确设置,则它将调用我的委托以获取UIPresentationController

我有一个自定义Segue,它也是一个UIViewControllerTransitioningDelegate。在perform()方法中,我将目标transitioningDelegate设置为self:

self.destination.transitioningDelegate = self

,我要么呼叫super.perform()(如果它是Present Modal或作为Popover Segue出现),要么呼叫self.source.present(self.destination, animated: true)(如果它是Custom Segue,因为调用super.perform()会引发异常)。

调用perform()animationController(…)方法,但从未调用presentationController(forPresented…)

最初,我尝试使用指定的自定义Segue类在情节提要板“按模态呈现”中制作Segue,但此操作一直删除了呈现的视图控制器。我尝试过“ Present as Popover”,并发誓它只能工作一次,因为它没有删除呈现的视图控制器,但是在随后的尝试中仍然可以。

因此我将其设置为“自定义”,并且perform()仍在目标视图控制器上以预先设置的_UIFullscreenPresentationController进行调用,而从未调用过我的presentationController(forPresented…)方法。 / p>

处理此问题的其他解决方案始终取决于该方法的某些误写签名。这是我的,一字不漏:

public func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController?

我花了最后四天的时间来弄清楚“适当的”自定义过渡,这似乎并没有像广告宣传那样对您有帮助。我想念什么?

1 个答案:

答案 0 :(得分:0)

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

您可以通过两个步骤来实现: 首先,将“容器视图”拉入主视图控制器并正确布局。故事板如下所示:(您可以看到有两个视图控制器。一个用于主视图,一个用于抽屉)

enter image description here

第二,您创建一个动作,根据需要对抽屉进行动画处理。一个简单的示例可能看起来像这样:

@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