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
}
IPhoneでは、ポップオーバーを表示するために以下を追加する必要があります。
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController!) -> UIModalPresentationStyle {
// Return no adaptive presentation style, use default presentation behaviour
return .None
}
Swift3/IOS10の場合、次のようなことを行う必要があるように見えます
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle
{
return .none
}
この答えを追加すると、Swift3/IOS10への移行時に私がしたように誰かがこの問題に遭遇します
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
}
}
受け入れられた答えは正しいです。完全性については、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
プロパティをいずれかのビューの特定の領域に設定します。
また、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