加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift – iOS 8中的UIPopoverController

发布时间:2020-12-14 04:42:02 所属栏目:百科 来源:网络整理
导读:我正在尝试将一个简单的popoverController添加到我的 iphone应用程序中,而我正在努力使用经典的“空白屏幕”,当我点击按钮时,它会覆盖所有内容. 我的代码看起来像这样: @IBAction func sendTapped(sender: UIBarButtonItem) { var popView = PopViewControl
我正在尝试将一个简单的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,但这并不难改变.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读