web-dev-qa-db-ja.com

ポップオーバーをフルスクリーンで表示するUIPopoverPresentationController

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
}
37
The Nomad

IPhoneでは、ポップオーバーを表示するために以下を追加する必要があります。

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

Swift3/IOS10の場合、次のようなことを行う必要があるように見えます

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

この答えを追加すると、Swift3/IOS10への移行時に私がしたように誰かがこの問題に遭遇します

18

Swift3 +/IOS10 +の場合、iPhoneを扱う場合:

次の場所にIPopoverPresentationControllerDelegateを追加する必要があります。

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

また、ポップオーバークラスの構成を設定することもできます

 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
mourodrigo

受け入れられた答えは正しいです。完全性については、Apple docs:の 表示されたView Controllerを新しいスタイルに適応させる を参照してください。

デリゲートのadaptivePresentationStyleForPresentationController:メソッド。デフォルトとは異なる表示スタイルを指定します。コンパクト環境に移行する場合、サポートされるスタイルは2つのフルスクリーンスタイルまたはUIModalPresentationNoneのみです。 UIModalPresentationNoneを返すと、プレゼンテーションコントローラーはコンパクトな環境を無視し、以前のプレゼンテーションスタイルを引き続き使用します。ポップオーバーの場合、変更を無視すると、すべてのデバイスで同じiPadのようなポップオーバー動作が得られます。

PopoverでのView Controllerの提示 からの必要な構成が満たされていることを確認してください:

[表示されたView Controllerの]モーダル表示スタイルをUIModalPresentationPopoverに設定した後、次のポップオーバー関連の属性を設定します。

  • View ControllerのpreferredContentSizeプロパティを目的のサイズに設定します。
  • 関連付けられたUIPopoverPresentationControllerオブジェクトを使用してポップオーバーアンカーポイントを設定します。これは、View ControllerのpopoverPresentationControllerプロパティからアクセスできます。
  • 次のいずれかのみを設定してください。
    • barButtonItemプロパティをバーボタンアイテムに設定します。
    • sourceViewプロパティとsourceRectプロパティをいずれかのビューの特定の領域に設定します。
1
Jesse Gumpo

iOS 12/Swift 4

また、IPhoneでポップオーバーをフルスクリーンとして表示し、IPadでポップオーバーをポップオーバーとして表示する可能性もあります。

adaptivePresentationStyle()に対して.popoverを返すだけです:

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

そして、@ mourodrigoのようにポップオーバー構成を設定します。

dialog.modalPresentationStyle = .popover
dialog.popoverPresentationController?.delegate = self
dialog.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
dialog.popoverPresentationController?.sourceView = view
dialog.popoverPresentationController?.sourceRect = view.frame
0
Sandu