web-dev-qa-db-ja.com

ポップオーバーのサイズを変更する方法

ポップオーバープレゼンテーションのサイズを変更するのに問題があります。ここに私がこれまで持っているものがあります

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) // func for popover
{
    if segue.identifier == "popoverView"
    {
        let vc = segue.destinationViewController

        let controller = vc.popoverPresentationController

        if controller != nil
        {
            controller?.delegate = self
            controller?.sourceView = self.view
            controller?.sourceRect = CGRect(x:CGRectGetMidX(self.view.bounds), y: CGRectGetMidY(self.view.bounds),width: 315,height: 230)
            controller?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
        }
    }
}

これまでのところ、ポップオーバーを中央に配置し、矢印を削除するだけです。これは良いことです。ただし、コンテナのサイズは変更されません。どんな助けも大歓迎です。ありがとうございました。

preferredContentSizeを使用すると、「プロパティに割り当てることができません: 'preferredContentSize'は不変です」というエラーが表示されます。

24
icestorm0806

popoverPresentationControllerではなく、表示されるView Controllerで優先コンテンツサイズを設定します

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) // func for popover
    {
        if segue.identifier == "popoverView"
        {
            let vc = segue.destinationViewController

            vc.preferredContentSize = CGSize(width: 200, height: 300)

            let controller = vc.popoverPresentationController

            controller?.delegate = self
            //you could set the following in your storyboard
            controller?.sourceView = self.view
            controller?.sourceRect = CGRect(x:CGRectGetMidX(self.view.bounds), y: CGRectGetMidY(self.view.bounds),width: 315,height: 230)
            controller?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)

        }
    }
51
beyowulf

ストーリーボードで修正しました:コントローラーをクリックします属性インスペクターをクリックしますViewController>チェック使用優先サイズと入力値を使用します。 enter image description here

19
Xeieshan

ストーリーボードを使用していません。ポップオーバーにUINavigationControllerを表示するだけです。

    self.present(popoverNavigationController!, animated: true) {}

新しいView Controllerがプッシュされるときにポップオーバーのサイズを変更する方法は、プッシュする前にpreferredContentSizeを変更するだけです。例えば:

    let newViewController = NewViewController()
    popoverNavigationController!.preferredContentSize = CGSize(width: 348, height: 400)
    popoverNavigationController!.pushViewController(newViewController, animated: true)

問題は、View Controllerをポップするときにポップオーバーのサイズを変更しようとするときです。

現在のView ControllerのviewWillDisappearを使用してポップオーバーのpreferredContentSizeを変更すると、Popoverのサイズは変更されますが、View Controllerがポップされた後です。これは、アニメーションに遅延があることを意味します。

PopViewControllerを実行する前に、preferredContentSizeを変更する必要があります。つまり、説明されているように、ナビゲーションバーにカスタムの戻るボタンを作成する必要があります here 。これは、Swift 4:

        self.navigationItem.hidesBackButton = true
        let newBackButton = UIBarButtonItem(title: "Back", style: .plain, target: self, action: #selector(CurrentViewController.backButtonTapped(sender:)))       
        self.navigationItem.leftBarButtonItem = newBackButton

新しい[戻る]ボタンが押されたときに次のコードを実行します。

   @objc func backButtonTapped(sender: UIBarButtonItem) {

        self.navigationController?.preferredContentSize = CGSize(width: 348, height: 200)

        self.navigationController?.popViewController(animated: true)
   }

基本的に、preferredContentSizeは、View Controllerをプッシュおよびポップする前に変更する必要があります。

1
Ginés SM

上記の答えはpreferredContentSizeの使用について述べていますが、最も重要なことは、プロトコルUIPopoverPresentationControllerDelegateを実装し、以下のメソッドを実装することです。

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