web-dev-qa-db-ja.com

なぜ「ポップオーバーとして存在する」セグエが画面全体を覆っているのですか?

私のプロジェクトでは、画面の右下にボタンがあり、ストーリーボードに別のuiviewcontrollerを追加し、コントロールドラッグして、ポップオーバーとして必要なuiviewcontrollerにした後、そのviewcontrollerのサイズを(300、300)に設定してチェックしました「優先する明示的なサイズを使用する」。アプリをロードしてボタンをクリックすると、画面全体が「ポップオーバー」で覆われます。私もpopoverViewControllerの.mファイルに移動してサイズを設定しようとしましたが、それも機能しませんでした。
何か案は?

編集:フルスクリーンにする必要があるように見えるので問題ありませんが、以前に発生していた他の問題がまだ発生しています。ポップアップ画面が表示され、背景を黒とアルファに.5にして、透けて見えるようにしますが、アニメーションは実行されますが、アニメーションが完了すると、画面は.5の不透明度から完全な黒になり、唯一の見えているのはバッテリーアイコンの物です。

19
coal175

OPはObjective-Cを使用します。この回答はSwiftのコードを示しています。 SwiftからObjective-Cへの変換は簡単です。

新しく追加されたViewControllerの「シミュレーションメトリック」で、「サイズ」を「フリーフォーム」に、「ステータスバー」を「なし」に変更します。

[シミュレーションサイズ]で、ビューの高さと幅をポップオーバーのコンテンツにしたい実際のサイズに変更します。

新しく追加されたVCにセグエを作成します。セグエタイプを「Present As Popover」として使用し、「popoverSegue」などのセグエの名前を指定します。

このセグエがトリガーされるViewConrollerで、UIPopoverPresentationControllerDelegateプロトコルを追加します。

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate {
}

PrepareForSegue関数をオーバーライドして、ポップオーバーセグエをキャッチします。 modalPresentationStyleを.Popoverに設定して、ポップオーバーが必要であることを明示的に示し、ビューのpopoverPresentationControllerのデリゲートプロパティをselfに割り当てます。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "popoverSegue" {
            let popoverViewController = segue.destinationViewController as! UIViewController
            popoverViewController.modalPresentationStyle = UIModalPresentationStyle.Popover
            popoverViewController.popoverPresentationController!.delegate = self
        }
    }

アダプティブプレゼンテーションスタイルフォープレゼンテーションコントローラー関数を実装して、ポップオーバープレゼンテーションが本当に必要であり、代替を受け入れないことをアプリに通知します。

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.None
    }

これらに続いて、フルスクリーンではなく、ViewControllerに設定されたサイズのiPhoneでポップアップを取得できます。

enter image description here

出典: iPhone上のSwiftを使用したiPadスタイルのポップオーバー

26
Bharat

Bharatの素晴らしい回答 のおかげで、私は個人的にはほとんど同じことを行うUIStoryboardSegueを使用しています。このようにして、ストーリーボードでセグエのクラスを変更し、必要なものを用意し、ViewControllerを汚染しないようにすることができます。

class AlwaysPopupSegue : UIStoryboardSegue, UIPopoverPresentationControllerDelegate
{
    override init(identifier: String?, source: UIViewController, destination: UIViewController)
    {
        super.init(identifier: identifier, source: source, destination: destination)
        destination.modalPresentationStyle = UIModalPresentationStyle.popover
        destination.popoverPresentationController!.delegate = self
    }
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.none
    }
}
6
Michel Donais

Swift 3バージョン

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == SEGUE_IDENTIFIER {
            let popoverViewController = segue.destination as! YourViewController

            popoverViewController.modalPresentationStyle = UIModalPresentationStyle.popover
            popoverViewController.popoverPresentationController!.delegate = self
        }
    }

    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.none
    }
6
korgx9

Swift 4バージョン

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "SegueIdentifier" {
            let popoverViewController = segue.destination
            popoverViewController.modalPresentationStyle = .popover
            popoverViewController.presentationController?.delegate = self
     }
}

追加することを忘れないでください

func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.none
    }
1
Korpel

IPhoneでは、すべてのポップオーバーを管理できるカスタムView Controllerを作成できます。各ビューコントローラーには独自のナビゲーションコントローラーがあるため、新しいビューコントローラーをapp.window.rootviewcontrollerにduビューとして追加し、すべてを前面に表示できます。

独自に作成したくない場合は、たとえば次のようなものを使用できます。 http://cocoapods.org/pods/FPPopover

0
Chitimalli