すべてのデバイスとすべての向きのポップオーバーに常にViewController
を表示したい。 UIPopoverPresentationControllerDelegate
を採用し、sourceView
とsourceRect
を設定することで、これを実現しようとしました。
これは、横向きのiPhone 6 Plusを除き、すべてのデバイスと向きで非常にうまく機能します。その場合、ビューコントローラーはフォームシートで画面の下から上にスライドします。それを常にポップオーバーに表示するようにするにはどうすればよいですか?
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let popoverPresentationController = segue.destinationViewController.popoverPresentationController
popoverPresentationController?.delegate = self
popoverPresentationController?.sourceView = self.titleLabel!.superview
popoverPresentationController?.sourceRect = self.titleLabel!.frame }
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
return UIModalPresentationStyle.None }
すべてのデバイスがiOS 8.2以降である
UIAdaptivePresentationControllerDelegate
の新しいadaptivePresentationStyleForPresentationController:traitCollection:
メソッドを実装します。
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller traitCollection:(UITraitCollection *)traitCollection {
// This method is called in iOS 8.3 or later regardless of trait collection, in which case use the original presentation style (UIModalPresentationNone signals no adaptation)
return UIModalPresentationNone;
}
UIModalPresentationNone
は、あなたのケースではポップオーバーを表示する元のプレゼンテーションスタイルを使用するようにプレゼンテーションコントローラーに指示します。
Swift 3では、元のadaptivePresentationStyle
メソッドを実装した場合、次のコードを追加するだけで機能します。
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
return adaptivePresentationStyle(for: controller)
}
Appleは、サイズクラスに基づいて、iPhone 6 Plusプレゼンテーションをそのように動作するように設計しました。
IPhone 6 Plusでのモーダルプレゼンテーションを防ぐには、特性コレクション(水平サイズ)をオーバーライドする必要があります。
プレゼンテーションコントローラのoverrideTraitCollection
プロパティを設定できるはずです。
presentedVC.presentationController.overrideTraitCollection = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact];
(申し訳ありませんが、目的C!Swiftはまだ学習していません。)
これに関して問題がある人々へのメモ:
この
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *) controller traitCollection:(UITraitCollection *)traitCollection {
return UIModalPresentationNone;
}
これと同じではありません
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController: (UIPresentationController * ) controller {
return UIModalPresentationNone;
}
後者は呼び出されません/前者と同じように動作しません。