私のプロジェクトでは、画面の右下にボタンがあり、ストーリーボードに別のuiviewcontrollerを追加し、コントロールドラッグして、ポップオーバーとして必要なuiviewcontrollerにした後、そのviewcontrollerのサイズを(300、300)に設定してチェックしました「優先する明示的なサイズを使用する」。アプリをロードしてボタンをクリックすると、画面全体が「ポップオーバー」で覆われます。私もpopoverViewControllerの.mファイルに移動してサイズを設定しようとしましたが、それも機能しませんでした。
何か案は?
編集:フルスクリーンにする必要があるように見えるので問題ありませんが、以前に発生していた他の問題がまだ発生しています。ポップアップ画面が表示され、背景を黒とアルファに.5にして、透けて見えるようにしますが、アニメーションは実行されますが、アニメーションが完了すると、画面は.5の不透明度から完全な黒になり、唯一の見えているのはバッテリーアイコンの物です。
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でポップアップを取得できます。
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
}
}
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
}
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
}
IPhoneでは、すべてのポップオーバーを管理できるカスタムView Controllerを作成できます。各ビューコントローラーには独自のナビゲーションコントローラーがあるため、新しいビューコントローラーをapp.window.rootviewcontrollerにduビューとして追加し、すべてを前面に表示できます。
独自に作成したくない場合は、たとえば次のようなものを使用できます。 http://cocoapods.org/pods/FPPopover