Как изменить размер popover

У меня возникли проблемы с изменением размера моей презентации popover. Вот что я до сих пор

 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)
        }
    }
}

До сих пор все это делает центр popover и удаляет стрелу, что хорошо. но он не изменяет размер контейнера. любая помощь будет принята с благодарностью. спасибо.

когда я использую preferredContentSize, я получаю сообщение об ошибке "Не могу назначить свойство:" preferredContentSize "является неизменным"

Ответ 1

Задайте предпочтительный размер содержимого на контроллере представления, а не popoverPresentationController

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)

        }
    }

Ответ 2

Я исправил это с помощью раскадровки: нажмите на контроллере. Нажмите на инспектор атрибутов ViewController> установите флажок Использовать предпочтительный явный размер и входные значения. enter image description here

Ответ 3

Я не использую раскадровки. Я просто представляю UINavigationController в поповере:

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

Способ изменить размер всплывающего окна, когда новый контроллер представления выдвигается, это просто изменить предпочитаемый размер содержимого, прежде чем нажать его. Например:

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

Проблема в том, когда мы пытаемся изменить размер всплывающего окна, когда мы открываем контроллер представления.

Если вы используете viewWillDisappear текущего контроллера представления для изменения предпочитаемого контекста popover, размер всплывающего окна изменится, но после извлечения контроллера представления. Это означает, что анимация имеет задержку.

Вы должны изменить предпочитаемый размер содержимого перед выполнением popViewController. Это означает, что вы должны создать пользовательскую кнопку "Назад" на панели навигации, как описано здесь. Это обновление, обновленное для 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)
   }

По сути, предпочитаемое значение ContentSize должно быть изменено перед нажатием и извлечением контроллера представления.

Ответ 4

Приведенные выше ответы являются правильными, в которых говорится об использовании preferredContentSize, но наиболее важным является реализация протокола UIPopoverPresentationControllerDelegate и реализация UIPopoverPresentationControllerDelegate ниже метода, в противном случае он не изменит размер содержимого, как ожидается.

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