Swift - iOS 8 中的 UIPopoverController

Posted

技术标签:

【中文标题】Swift - iOS 8 中的 UIPopoverController【英文标题】:Swift - UIPopoverController in iOS 8 【发布时间】: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 上获取此函数所需的实现。但是仍然:仍然有一个空白图像覆盖整个屏幕,我不知道如何修复它。

任何建议将不胜感激。

【问题讨论】:

【参考方案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.swiftUIVIewController 的扩展。您可以在AuthViewController.swift 的验证函数中看到它的使用情况。 presentAlertPopover method 接受一个字符串并使用它来设置我设置的GenericAlertViewController 中的 UILabel 的值(使动态文本弹出框变得容易)。但实际的弹出框魔术都发生在presentViewControllerAsPopover method 中,它接受两个参数:要呈现的UIViewController 实例,以及用作呈现弹出框的锚点的UIView 对象。箭头方向被硬编码为UIPopoverArrowDirection.Up,但这并不难改变。

【讨论】:

@CliftonLabrum 是的,事实上。我会用这些信息更新我的答案。

以上是关于Swift - iOS 8 中的 UIPopoverController的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8 中的自定义振动 - Swift

关闭 iOS 8 和 Swift 中的所有通知?

具有大小类的自调整 UITableViewCells 中的多行 UILabel - iOS 8 和 Swift

Xcode 8 / Swift 3 中的 iOS 异步单元测试(waitForExpectations 失败)

如何在SWIFT3 XCODE 8.2中的IOS应用程序中的Snackbar的操作中显示特定视图

如何在 SWIFT3 XCODE 8.2 的 IOS 应用程序中显示 Snackbar 的操作中的特定视图