微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift – iOS 8中的UIPopoverController

我正在尝试将一个简单的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上获得此功能.但仍然:整个屏幕上仍然有一个空白图像,我不知道如何修复它.

任何建议,将不胜感激.

解决方法

我为此实现的解决方案基于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的值(使其变得容易有动态文本弹出窗口).但实际的popover魔法都发生在presentViewControllerAsPopover method中,它带有两个参数:要呈现的UIViewController实例,以及一个UIView对象,用作从中呈现弹出窗口的锚点.箭头方向被硬编码为UIPopoverArrowDirection.Up,但这并不难改变.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐