【问题标题】:Swift - UIPopoverController in iOS 8Swift - iOS 8 中的 UIPopoverController
【发布时间】:2014-12-27 18:19:13
【问题描述】:

我正在尝试将一个简单的 popoverController 添加到我的 iphone 应用程序中,而我目前正在努力使用经典的“空白屏幕”,当我点击按钮时它会覆盖所有内容。

我的代码如下所示:

@IBAction func sendTapped(sender: UIBarButtonItem) {


    var popView = PopViewController(nibName: "PopView", bundle: nil)

    var popController = UIPopoverController(contentViewController: popView)

    popController.popoverContentSize = CGSize(width: 3, height: 3)

    popController.presentPopoverFromBarButtonItem(sendTappedOutl, permittedArrowDirections: UIPopoverArrowDirection.Up, animated: true)

    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController!) -> UIModalPresentationStyle {
        // Return no adaptive presentation style, use default presentation behaviour
        return .None
    }

}

adaptivePresentationStyleForPresentationController 函数只是我添加的东西,因为我在某处读到这是在 iphone 上获取此函数所需的实现。但是仍然:仍然有一个空白图像覆盖整个屏幕,我不知道如何修复它。

任何建议将不胜感激。

【问题讨论】:

    标签: ios swift uipopovercontroller


    【解决方案1】:

    我为此实施的解决方案基于 2014 年 WWDC 会议View Controller Advancements in iOS 8 中提出的示例(请参阅slide notes)。请注意,您必须将adaptivePresentationStyleForPresentationController 函数作为UIPopoverPresentationControllerDelegate 的一部分来实现,但该函数应该在主视图控制器中的sendTapped 函数之外,并且您必须在类声明中指定UIPopoverPresentationControllerDelegate该文件中的行以确保您的代码修改了该行为。我还冒昧地将在弹出窗口中呈现视图控制器的逻辑分离到它自己的函数中,并添加了一个检查以确保该函数不呈现请求视图控制器,如果它已经呈现在当前上下文中。

    因此,您的解决方案可能如下所示:

    // ViewController must implement UIPopoverPresentationControllerDelegate
    class TheViewController: UIViewController, UIPopoverPresentationControllerDelegate {
        // ...
        // The contents of TheViewController class
        // ...
    
        @IBAction func sendTapped(sender: UIBarButtonItem) {
            let popView = PopViewController(nibName: "PopView", bundle: nil)
            self.presentViewControllerAsPopover(popView, barButtonItem: sender)
        }
    
        func presentViewControllerAsPopover(viewController: UIViewController, barButtonItem: UIBarButtonItem) {
            if let presentedVC = self.presentedViewController {
                if presentedVC.nibName == viewController.nibName {
                    // The view is already being presented
                    return
                }
            }
            // Specify presentation style first (makes the popoverPresentationController property available)
            viewController.modalPresentationStyle = .Popover
            let viewPresentationController = viewController.popoverPresentationController?
            if let presentationController = viewPresentationController {
                presentationController.delegate                 = self
                presentationController.barButtonItem            = barButtonItem
                presentationController.permittedArrowDirections = .Up
            }
            viewController.preferredContentSize = CGSize(width: 30, height: 30)
    
            self.presentViewController(viewController, animated: true, completion: nil)
        }
    
        func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
            return .None
        }
    }
    

    现实世界的实现

    我在 Github 上托管的一个正在进行的应用程序中的注册表单上实现了这种输入验证方法。我将它实现为UIViewController+Extensions.swift 中UIVIewController 的扩展。您可以在AuthViewController.swift 的验证函数中看到它的使用情况。 presentAlertPopover method 接受一个字符串并使用它来设置我设置的GenericAlertViewController 中的 UILabel 的值(使动态文本弹出框变得容易)。但实际的弹出框魔术都发生在presentViewControllerAsPopover method 中,它接受两个参数:要呈现的UIViewController 实例,以及用作呈现弹出框的锚点的UIView 对象。箭头方向被硬编码为UIPopoverArrowDirection.Up,但这并不难改变。

    【讨论】:

    • @CliftonLabrum 是的,事实上。我会用这些信息更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多