Почему "присутствовать как popover" segue покрывает весь экран?

В моем проекте у меня есть кнопка в нижней правой части экрана, и я добавил еще один uiviewcontroller в раскадровку, перетащил элемент управления в uiviewcontroller, который я хотел в качестве popover, а затем установил размер viewcontroller (300, 300 ) и проверили "использовать предпочтительный явный размер". Когда я загружаю приложение и нажимаю кнопку, весь экран покрывается "popover". Я также попытался войти в файл popoverViewController.m и установить размер, но это тоже не сработало.
Любые идеи?

Изменить: поскольку похоже, что у меня должен быть полноэкранный режим, но я все еще сталкиваюсь с некоторыми другими проблемами, которые были у меня раньше. Появится всплывающее окно, и я сделаю черный фон и альфа, как .5, чтобы увидеть его, однако он будет делать анимацию, а затем, как только анимация закончится, экран перейдет от .5 непрозрачности до полностью черного и единственного вещь, которую я вижу, это значок аккумулятора.

Ответ 1

OP использует Objective-C. В этом ответе приведен код быстро. Преобразование swift в Objective-C должно быть простым.

В новом добавленном ViewController в разделе "Имитированные показатели" измените "Размер" на "Свободная форма" и "Строка состояния" на "Нет".

В разделе "Имитированный размер" измените высоту и ширину просмотров на фактический размер, в котором вы хотите, чтобы ваш контент popovers был.

Создайте сегмент для вновь добавленного VC. Используйте тип segue как "Present As Popover" и укажите имя для segue, например "popoverSegue".

В ViewConroller, с которого должен запускаться этот сеанс, добавьте протокол UIPopoverPresentationControllerDelegate.

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate {
}

Переопределите функцию prepareForSegue, чтобы поймать ваш popover segue. Установите modalPresentationStyle в .Popover, чтобы явно указать, что вы хотите popover, а затем назначьте свойство delegate представлений popoverPresentationController для себя:

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

Внедрите функцию adaptivePresentationStyleForPresentationController, чтобы сообщить своему приложению, что вы действительно хотите эту презентацию, и не будете принимать никаких замен:

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

После этого я могу получить всплывающее окно на iPhone, которое не полноэкранное, а размер, заданный для ViewController.

введите описание изображения здесь

Источник: Стиль iPad Popovers на iPhone с Swift

Ответ 2

версия 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
    }

Ответ 3

Благодаря Бхарат за отличный ответ, я лично использую UIStoryboardSegue, который делает почти то же самое. Таким образом, я могу изменить класс segue в раскадровке, иметь то, что хочу, и не загрязнять мои ViewControllers:

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

Ответ 4

На iPhone вы можете создать настраиваемый контроллер представлений, который может управлять всеми popovers. Поскольку каждый контроллер представления имеет свой собственный контроллер навигации, вы можете добавить новый контроллер представления в app.window.rootviewcontroller как образ du и перенести все на передний план.

Если вы не хотите писать свои собственные, вы можете использовать что-то вроде этого, например: http://cocoapods.org/pods/FPPopover