UIPopoverPresentationController将popover显示为全屏

时间:2014-12-08 07:59:46

标签: ios swift popover uipopover

我正在尝试使用UIPopoverPresentationController来显示不占据整个屏幕的popover。我跟着许多不同的教程没有运气。

这是我的代码。它正确地实例化了ViewController,但它占据了整个屏幕而不是我在preferredContentSize中定义的更小的屏幕。

func showPopover() {
    let vc = self.storyboard?.instantiateViewControllerWithIdentifier("PopupTimePickerViewController") as PopupTimePickerViewController
    vc.modalPresentationStyle = .Popover
    vc.preferredContentSize = CGSizeMake(200, 100)

    if let presentationController = vc.popoverPresentationController {
        presentationController.delegate = self
        presentationController.permittedArrowDirections = .Up
        presentationController.sourceView = self.view
        presentationController.sourceRect = CGRectMake(0, 0, 50, 50)

        self.presentViewController(vc, animated: true, completion: nil)
    }
}

使用正确答案更新9/27/16

func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
    return .none
}

6 个答案:

答案 0 :(得分:37)

在iPhone中,您应该添加以下内容以呈现弹出窗口。

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

答案 1 :(得分:17)

对于Swift3 / IOS10,看起来我们需要做一些像

这样的事情
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle
{
    return .none
}

添加此答案,万一有人遇到此问题,就像我迁移到swift3 / IOS10时那样

答案 2 :(得分:2)

对于Swift3 + / IOS10 +,在处理iPhone时:

您必须在以下位置添加 UIPopoverPresentationControllerDelegate 代表:

class YourClass:  UIViewController, UIPopoverPresentationControllerDelegate { ...

然后在同一个父类(将显示弹出窗口)中实现下面的方法。

func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle
{
    return .none
}

然后设置下面的弹出配置:

myPopover.modalPresentationStyle = .popover
myPopover.popoverPresentationController?.sourceRect = VIEWTOPOINTTHEARROW.frame
myPopover.popoverPresentationController?.sourceView = self.view
myPopover.popoverPresentationController?.delegate = self

您也可以为popover类设置一些配置

 class MyPopover: UIViewController {

 override func viewDidLoad() {
    super.viewDidLoad()
    //popover size
    self.preferredContentSize = CGSize(width: 320, height: 200) 
    //sets the arrow of the popover to same color of background
    self.popoverPresentationController?.backgroundColor = self.view.backgroundColor
   }

 }

答案 3 :(得分:1)

接受的答案是正确的。有关完整性,请参阅Apple文档中的Adapting Presented View Controllers to a New Style

  

使用委托的adaptivePresentationStyleForPresentationController:方法指定与默认方式不同的演示文稿样式。转换到紧凑的环境时,唯一支持的样式是两个全屏样式或UIModalPresentationNone。返回UIModalPresentationNone告诉演示控制器忽略紧凑环境并继续使用先前的演示样式。对于弹出框,忽略更改会在所有设备上为您提供类似iPad的弹出行为。

确保符合Presenting a View Controller in a Popover所需的配置:

  

将[所呈现的视图控制器]的模态演示样式设置为UIModalPresentationPopover后,配置以下与popover相关的属性:

     
      
  • 将视图控制器的preferredContentSize属性设置为所需的大小。
  •   
  • 使用关联的UIPopoverPresentationController对象设置弹出窗口锚点,该对象可从中访问   查看控制器的popoverPresentationController属性。
  •   
  • 仅设置以下其中一项:      
        
    • barButtonItem属性设置为条形按钮项。
    •   
    • sourceViewsourceRect属性设置为您其中一个视图中的特定区域。
    •   
  •   

答案 4 :(得分:0)

iOS 12 / Swift 4

也有可能在iPhone上以全屏显示弹出窗口,而在iPad上以弹出窗口显示弹出窗口。

只需返回.popover的{​​{1}}:

adaptivePresentationStyle()

并像@mourodrigo一样设置popover配置:

func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
    return .popover
}

答案 5 :(得分:0)

objective-c版本:

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
    return UIModalPresentationNone;
}