ポップオーバープレゼンテーションのサイズを変更するのに問題があります。ここに私がこれまで持っているものがあります
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'は不変です」というエラーが表示されます。
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)
}
}
ストーリーボードを使用していません。ポップオーバーに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をプッシュおよびポップする前に変更する必要があります。
上記の答えはpreferredContentSize
の使用について述べていますが、最も重要なことは、プロトコルUIPopoverPresentationControllerDelegate
を実装し、以下のメソッドを実装することです。
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return UIModalPresentationStyle.none
}