Я пытаюсь добавить UIPopoverView в свое приложение Swift iOS 8, но мне не удается получить доступ к свойству PopoverContentSize, поскольку всплывающее окно не отображается в правильной форме. мой код:
var popover: UIPopoverController? = nil
func addCategory() {
var newCategory = storyboard.instantiateViewControllerWithIdentifier("NewCategory") as UIViewController
var nav = UINavigationController(rootViewController: newCategory)
popover = UIPopoverController(contentViewController: nav)
popover!.setPopoverContentSize(CGSizeMake(550, 600), animated: true)
popover!.delegate = self
popover!.presentPopoverFromBarButtonItem(self.navigationItem.rightBarButtonItem, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true)
}
вывод:
Когда я делаю то же самое через UIPopoverPresentationController, я все равно не могу этого сделать. это мой код:
func addCategory() {
var popoverContent = self.storyboard.instantiateViewControllerWithIdentifier("NewCategory") as UIViewController
var nav = UINavigationController(rootViewController: popoverContent)
nav.modalPresentationStyle = UIModalPresentationStyle.Popover
var popover = nav.popoverPresentationController as UIPopoverPresentationController
popover.delegate = self
popover.popoverContentSize = CGSizeMake(1000, 300)
popover.sourceView = self.view
popover.sourceRect = CGRectMake(100,100,0,0)
self.presentViewController(nav, animated: true, completion: nil)
}
Я получаю точно такой же результат.
Как мне изменить размер всплывающего окна? Любая помощь будет высоко ценится!
Ответы:
Хорошо, сосед по дому взглянул на это и сообразил:
Это способ.
Вы больше не разговариваете с самим всплывающим окном, вы разговариваете с контроллером представления внутри него, чтобы установить размер содержимого, вызывая свойство
preferredContentSize
источник
На самом деле все намного проще. В раскадровке вы должны сделать viewcontroller, который вы хотите использовать как всплывающее окно, и создать для него класс viewcontroller как обычно. Сделайте переход, как показано ниже, из объекта, который вы хотите открыть во всплывающем окне, в данном случае с
UIBarButton
именем «Config».В «материнском контроллере представления» реализовать
UIPopoverPresentationControllerDelegate
метод делегата и:Переопределите
prepareForSeque
метод следующим образом:И вы сделали. И теперь вы можете рассматривать представление всплывающего окна как любое другое представление, т.е. добавить поля а что нет! И вы получите контроллер содержимого, используя
popoverPresentationController.presentedViewController
метод вUIPopoverPresentationController
.Также на iPhone вам придется перезаписать
источник
Я нашел полный пример того, как заставить все это работать, чтобы вы всегда могли отображать всплывающее окно независимо от устройства / ориентации https://github.com/frogcjn/AdaptivePopover_iOS8_Swift .
Ключ - реализовать UIAdaptivePresentationControllerDelegate
Затем расширите приведенный выше пример (из Imagine Digital):
источник
UIModalPresentationFullScreen
илиUIModalPresentationOverFullScreen
». Кроме того, «Если вы не реализуете этот метод или не вернете какой-либо стиль, отличный отUIModalPresentationFullScreen
илиUIModalPresentationOverFullScreen
, контроллер представления подстраивает стиль представления кUIModalPresentationFullScreen
стилю».Swift 2.0
Хорошо, я отработал. Посмотри. Сделал ViewController в StoryBoard. Связан с классом PopOverViewController.
См. ViewController:
Примечание. Метод func showPopover (base: UIView) следует разместить перед ViewDidLoad. Надеюсь, поможет !
источник
showPopover(base: UIView)
метод следует размещать раньшеviewDidLoad()
?В iOS9 UIPopoverController обесценивается. Поэтому можно использовать приведенный ниже код для версии Objective-C выше iOS9.x,
источник
Здесь я конвертирую Swift-код "Joris416" в Objective-c,
Не забудьте ДОБАВИТЬ
UIPopoverPresentationControllerDelegate, UIAdaptivePresentationControllerDelegate
источник
Лучше всего это объясняется в блоге iOS8 Day-by-Day.
Короче говоря, после того, как вы установили для вашего UIViewController modalPresentationStyle значение .Popover, вы можете получить UIPopoverPresentationClass (новый класс iOS8) через свойство popoverPresentationController контроллера.
источник
Я сделал Objective-C версию быстрого ответа Imagine Digitals выше. Не думаю, что я что-то пропустил, так как это работает при предварительном тестировании, если вы заметите что-то, дайте мне знать, и я обновлю его
источник
popover.sourceView = self.view;
мои два цента за xcode 9.1 / swift 4.
и поэкспериментируйте:
func adaptivePresentationStyle ...
или: return .pageSheet .... и так далее ..
источник
Реализуйте UIAdaptivePresentationControllerDelegate в своем Viewcontroller. Затем добавьте :
источник
Далее приводится довольно подробное руководство по настройке и представлению всплывающих окон. https://www.appcoda.com/presentation-controllers-tutorial/
Таким образом, жизнеспособная реализация (с некоторыми обновлениями синтаксиса исходной статьи для Swift 4.2 ), которую затем можно будет вызвать из другого места, будет примерно такой:
Многое из этого уже было рассмотрено в ответе @mmc, но статья помогает объяснить некоторые из этих используемых элементов кода, а также показывает, как это можно расширить.
Он также предоставляет множество дополнительных сведений об использовании делегирования для обработки стиля представления для iPhone по сравнению с iPad и позволяет закрыть всплывающее окно, если оно когда-либо отображается в полноэкранном режиме. Опять же, обновлено для Swift 4.2 :
Надеюсь это поможет.
источник
Для желающих учиться!
Я создал проект с открытым исходным кодом для тех, кто хочет изучать и использовать представление Popover для любых целей. Вы можете найти проект здесь. https://github.com/tryWabbit/KTListPopup
источник