web-dev-qa-db-ja.com

横向きのiPhone 6 PlusのUIModalPresentationPopoverがポップオーバーを表示しない

すべてのデバイスとすべての向きのポップオーバーに常にViewControllerを表示したい。 UIPopoverPresentationControllerDelegateを採用し、sourceViewsourceRectを設定することで、これを実現しようとしました。

これは、横向きの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以降である

32
Loegic

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は、あなたのケースではポップオーバーを表示する元のプレゼンテーションスタイルを使用するようにプレゼンテーションコントローラーに指示します。

70
Joshua

Swift 3では、元のadaptivePresentationStyleメソッドを実装した場合、次のコードを追加するだけで機能します。

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

Appleは、サイズクラスに基づいて、iPhone 6 Plusプレゼンテーションをそのように動作するように設計しました。

IPhone 6 Plusでのモーダルプレゼンテーションを防ぐには、特性コレクション(水平サイズ)をオーバーライドする必要があります。

プレゼンテーションコントローラのoverrideTraitCollectionプロパティを設定できるはずです。

presentedVC.presentationController.overrideTraitCollection = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact];

(申し訳ありませんが、目的C!Swiftはまだ学習していません。)

1
user4151918

これに関して問題がある人々へのメモ:

この

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

これと同じではありません

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

後者は呼び出されません/前者と同じように動作しません。

0
visc