如何在 iOS8 和 Swift 中推送视图

Posted

技术标签:

【中文标题】如何在 iOS8 和 Swift 中推送视图【英文标题】:How to push a view in iOS8 and Swift 【发布时间】:2014-12-05 14:35:20 【问题描述】:

我正在更新 ios5 之前的应用程序 - 因此需要进行很多更改。 在现有应用中,我们将视图(在 nib 中创建)推送到包含 UIPickerView/UIDatePicker 的屏幕上,以允许用户进行选择。

我这应该是迁移到 iOS8/Swift 的一件容易的事情,但我在过去的 24 小时里一直在尝试用 Storyboard/Segue、Container 视图、viewControllers、UIPopoverPresentationControler 等找到最好的方法,但几乎没有达成共识(甚至苹果的示例代码都将 UIDatePicker 推送到表格单元格中)

这似乎是一个常见的要求,如果其他人如何解决这个问题,我将不胜感激。

非常感谢

【问题讨论】:

你能提供更多细节吗?至少是您尝试转换的 obj-c 代码。 【参考方案1】:

试试这个

self.performSegueWithIdentifier("你的segue标识符", sender: self)

【讨论】:

您能提供更多细节吗?【参考方案2】:

感谢您寻求澄清的答案和问题。 经过一个周末的调查,我意识到我已经陷入了旧的 iOS 模式。

在 iOS8 中,一切都转移到 ViewController 演示中,允许开发人员控制动画并定义一系列设备(不同方向)上的行为。

我的问题的最终答案(我相信)如下:

    使用 UIPresentationController 呈现所需的 UIViewController: 视图控制器是要显示的视图(使用代码、nib 或故事板来创建选择器视图) 展示控制器管理它的展示方式(例如尺寸、展示风格) 这也是处理透明/模糊视图以覆盖现有内容的地方

签出: func sizeForChildContentContainer(container: UIContentContainer, withParentContainerSize parentSize: CGSize) -> CGSize func frameOfPresentedViewInContainerView() -> CGRect

    UIPresentationController 需要一个过渡委托来管理演示(符合 UIViewControllerTransitioningDelegate)

// We need to create a presentation controller to manage the presentation of VC
func presentationControllerForPresentedViewController(presented: UIViewController, presentingViewController presenting: UIViewController!, sourceViewController source: UIViewController) -> UIPresentationController? 
    let opc = OverlayPresentationController(presentedViewController: presented, presentingViewController: source)
    return opc


// Get hold of an animation controller for presentation
func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? 
    let animationController = OverlayAnimatedTransitioning()
    return animationController


// Get hold of an animation controller for dismissal
func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? 
    let animationController = OverlayAnimatedTransitioning()
    return animationController

    这又需要一个动画控制器 (UIViewControllerAnimatedTransitioning) 来处理动画(滑动、溶解或其他更冒险的东西):

    func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval 返回 0.5

    func animateTransition(transitionContext: UIViewControllerContextTransitioning)

    let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)!
    let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!
    let containerView = transitionContext.containerView()
    
    let animationDuration = self .transitionDuration(transitionContext)
    containerView.addSubview(toViewController.view)
    
    UIView.animateWithDuration(animationDuration, animations:  () -> Void in
        <<< Animation Here>>>)
        )  (finished: Bool) in
            transitionContext.completeTransition(true)
    
    

    构建块到位后,可以调用所需的 UIViewController(使用动作/选择器/segue),并通过设置所需视图的 transitioningDelegate 属性来调用所需的效果:

    @IBAction func showOVC(sender: AnyObject) 
        let ovc = OverlayViewController()
        let overlayTransitioningDelegate = OverlayTransitioningDelegate()
        ovc.transitioningDelegate = overlayTransitioningDelegate
        self.presentViewController(ovc, animated: true, completion: nil)
    
    

    解雇的处理方式相同,只需调用:

    dismissViewControllerAnimated(true, 完成: nil)

更多信息可以通过文档和优秀的 WWDC 视频获得,这让我明白了一切:A look inside presentation controllers

或查看苹果的示例代码:LookInside

底线 - 不像以前那么简单(假设单个设备在一个方向),但稍微复杂一点,对视图和动画的控制要大得多,并且能够扩展到多个设备。

我希望这对处于类似位置的人有所帮助 谢谢

【讨论】:

以上是关于如何在 iOS8 和 Swift 中推送视图的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中推送 iOS8 的通知状态

如何在 SWIFT 中推送视图之前加载视图?

如何在swift中基于Json id从集合视图didSelectItemAt推送不同的视图控制器

如何使用代码在 Swift iOS8 中模拟按钮按下

使用 Swift 2 将不允许 iOS 8 设备注册推送通知

在 NavigationIOS 中推送视图时如何传递对象而不是类型?