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

Apple предоставляет несколько подобных UIViewController, например UIAlertView, Twitter или Facebook share view controller и т. д..
как мы можем достичь этого эффекта для обычая контроллер?
8 ответов:
Примечание: это решение не работает в iOS 8. Я опубликую новое решение как можно скорее.
я собираюсь ответить здесь, используя раскадровку, но это также возможно без раскадровки.
Init: создать два
UIViewControllerв раскадровке.
- допустим
FirstViewControllerчто нормально иSecondViewControllerкоторый будет всплывающее окно.модал Темы: поставить
UIButtonв FirstViewController и создать сегмент на этомUIButtonдоSecondViewControllerкак модальные слова.Сделать Прозрачным: Теперь выберите
UIView(UIView, который создается по умолчанию сUIViewController) ofSecondViewControllerи изменить его цвет фона на прозрачный цвет.сделать фон тусклым: добавить
UIImageViewнаSecondViewControllerкоторый покрывает весь экран и устанавливает свое изображение к некоторому затемненному semi прозрачное изображение. Вы можете получить образец здесь :UIAlertViewФоновый РисунокДисплей Конструкция: теперь добавьте
UIViewи сделать любой дизайн вы хотите показать. Вот скриншот моей раскадровки
- здесь у меня есть добавить segue на кнопку входа в систему, которая открывает
SecondViewControllerкак всплывающее окно, чтобы задать имя пользователя и парольважно: вот что главное шаг. Мы хотим этого
SecondViewControllerне скрывает FirstViewController полностью. Мы установили четкий цвет, но этого недостаточно. По умолчанию он добавляет черный за презентацией модели, поэтому мы должны добавить одну строку кода в viewDidLoadFirstViewController. Вы можете добавить его в другом месте, но он должен работать до segue.
[self setModalPresentationStyle:UIModalPresentationCurrentContext];уволить: когда уволить зависит от вашего варианта использования. Это модальное представление, поэтому, чтобы уволить мы делаем то, что мы сделайте для модального представления:
[self dismissViewControllerAnimated:YES completion:Nil];вот и все.....
любые предложения и комментарии приветствуются.
Demo: Вы можете получить демо-исходный проект отсюда:Popup Demo
новая: кто-то очень хорошо поработал над этой концепцией : MZFormSheetController
новая : я нашел один код, чтобы получить этот вид функции : KLCPopup
обновление iOS 8 : я сделал этот метод для работы с iOS 7 и iOS 8
+ (void)setPresentationStyleForSelfController:(UIViewController *)selfController presentingController:(UIViewController *)presentingController { if (iOSVersion >= 8.0) { presentingController.providesPresentationContextTransitionStyle = YES; presentingController.definesPresentationContext = YES; [presentingController setModalPresentationStyle:UIModalPresentationOverCurrentContext]; } else { [selfController setModalPresentationStyle:UIModalPresentationCurrentContext]; [selfController.navigationController setModalPresentationStyle:UIModalPresentationCurrentContext]; } }
можно использовать этот метод внутри prepareForSegue deligate, как это
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { PopUpViewController *popup = segue.destinationViewController; [self setPresentationStyleForSelfController:self presentingController:popup] }
модальные всплывающие окна в Interface Builder (раскадровки)
Шаг 1
на ViewController, который вы хотите использовать в качестве модального всплывающего окна, очистите цвет фона корневого UIView.
Совет: не используйте корневой UIView в качестве всплывающего окна. Добавьте новый UIView, который меньше, чтобы быть вашим всплывающим окном.
Шаг 2
создайте сегмент для ViewController, который имеет ваше всплывающее окно. Выберите "Присутствует Модально".
два Методы Для Создания Всплывающего Окна Отсюда
метод Один-использование Segue
выберите темы и изложения изменений к "за текущий контекст":
Метод второй-с помощью контроллера вида
выберите сцену ViewController, которая является вашим всплывающим окном. В Инспекторе атрибутов в разделе контроллер вида установите для представления значение " над текущим контекстом":
любой метод будет работать. Это должно быть сделай это!
вы можете сделать это в Interface Builder.
- для вида, который вы хотите представить модально установите его внешний вид фона прозрачным
- управление + нажмите и перетащите из контроллера вида хоста в контроллер модального вида
- выберите модально
- нажмите на вновь созданный сегмент и в Инспекторе атрибутов (справа) установите "презентация" В "над текущим контекстом"
Не стесняйтесь использовать мой контроллер листа формы MZFormSheetControllerдля iPhone, в примере проекта есть много примеров о том, как представить контроллер модального вида, который не будет охватывать полное окно и имеет много стилей представления/перехода.
вы также можете попробовать новейшую версию MZFormSheetController, которая называется MZFormSheetPresentationController и много больше возможностей.
вы можете использовать EzPopup (https://github.com/huynguyencong/EzPopup), это быстрый стручок и очень проста в использовании:
// init YourViewController let contentVC = ... // Init popup view controller with content is your content view controller let popupVC = PopupViewController(contentController: contentVC, popupWidth: 100, popupHeight: 200) // show it by call present(_ , animated:) method from a current UIViewController present(popupVC, animated: true)
вы можете сделать это, чтобы добавить любой другой подвид к контроллеру вида. Сначала установите в строке состояния значение None для ViewController, который вы хотите добавить в качестве подвида, чтобы вы могли изменить размер на все, что хотите. Затем создайте кнопку в контроллере текущего вида и метод для нажатия кнопки. В методе:
- (IBAction)btnLogin:(id)sender { SubView *sub = [[SubView alloc] initWithNibName:@"SubView" bundle:nil]; sub.view.frame = CGRectMake(20, 100, sub.view.frame.size.width, sub.view.frame.size.height); [self.view addSubview:sub.view]; }надеюсь, что это поможет, не стесняйтесь спрашивать, если какие-либо вопросы...
Imao поставить UIImageView на фоне не самая лучшая идея . В моем случае я добавил на вид контроллера другие 2 вида . Первый вид имеет
[UIColor clearColor]на фоне, второй цвет, который u хочет быть прозрачным (серый в моем случае).Обратите внимание, что порядок важен.Затем для второго вида установите Альфа 0.5 (Альфа >=0 prepareForSegueinfoVC.providesPresentationContextTransitionStyle = YES; infoVC.definesPresentationContext = YES;и вот и все.
Swift 4:
чтобы добавить наложение или всплывающее окно Вы также можете использовать Контейнер Вид С помощью которого вы получаете бесплатный контроллер вида (вы получаете вид контейнера из обычной палитры объектов/библиотеки)
действия:
есть вид (ViewForContainer на рис.), который содержит этот вид контейнера, чтобы затемнить его, когда содержимое вида контейнера отображается. Подключите розетку внутри первого контроллера вида
скрыть это представление при загрузке 1-го VC
чтобы затемнить это представление при отображении содержимого представления контейнера, установите фон представления на черный и непрозрачность 30%










Comments