Дисплей UIViewController как всплывающее окно в iPhone



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



часто нам нужно представить UIViewController таким образом, что он не охватывает весь экран, как на картинке ниже.



enter image description here



Apple предоставляет несколько подобных UIViewController, например UIAlertView, Twitter или Facebook share view controller и т. д..



как мы можем достичь этого эффекта для обычая контроллер?

754   8  

8 ответов:

Примечание: это решение не работает в iOS 8. Я опубликую новое решение как можно скорее.

я собираюсь ответить здесь, используя раскадровку, но это также возможно без раскадровки.

  1. Init: создать два UIViewController в раскадровке.

    • допустим FirstViewController что нормально и SecondViewController который будет всплывающее окно.

  2. модал Темы: поставить UIButton в FirstViewController и создать сегмент на этом UIButton до SecondViewController как модальные слова.

  3. Сделать Прозрачным: Теперь выберите UIView (UIView, который создается по умолчанию с UIViewController) of SecondViewController и изменить его цвет фона на прозрачный цвет.

  4. сделать фон тусклым: добавить UIImageView на SecondViewController который покрывает весь экран и устанавливает свое изображение к некоторому затемненному semi прозрачное изображение. Вы можете получить образец здесь : UIAlertView Фоновый Рисунок

  5. Дисплей Конструкция: теперь добавьте UIView и сделать любой дизайн вы хотите показать. Вот скриншот моей раскадровки storyboard

    • здесь у меня есть добавить segue на кнопку входа в систему, которая открывает SecondViewController как всплывающее окно, чтобы задать имя пользователя и пароль
  6. важно: вот что главное шаг. Мы хотим этого SecondViewController не скрывает FirstViewController полностью. Мы установили четкий цвет, но этого недостаточно. По умолчанию он добавляет черный за презентацией модели, поэтому мы должны добавить одну строку кода в viewDidLoad FirstViewController. Вы можете добавить его в другом месте, но он должен работать до segue.

    [self setModalPresentationStyle:UIModalPresentationCurrentContext];

  7. уволить: когда уволить зависит от вашего варианта использования. Это модальное представление, поэтому, чтобы уволить мы делаем то, что мы сделайте для модального представления:

    [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. Set Clear Color on root view Совет: не используйте корневой UIView в качестве всплывающего окна. Добавьте новый UIView, который меньше, чтобы быть вашим всплывающим окном.

Шаг 2

создайте сегмент для ViewController, который имеет ваше всплывающее окно. Выберите "Присутствует Модально". Segue

два Методы Для Создания Всплывающего Окна Отсюда

метод Один-использование Segue

выберите темы и изложения изменений к "за текущий контекст": Over Current Context

Метод второй-с помощью контроллера вида

выберите сцену ViewController, которая является вашим всплывающим окном. В Инспекторе атрибутов в разделе контроллер вида установите для представления значение " над текущим контекстом": ViewController

любой метод будет работать. Это должно быть сделай это!

Finished Product

вы можете сделать это в 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 prepareForSegue

infoVC.providesPresentationContextTransitionStyle = YES;
infoVC.definesPresentationContext = YES;

и вот и все.

Swift 4:

чтобы добавить наложение или всплывающее окно Вы также можете использовать Контейнер Вид С помощью которого вы получаете бесплатный контроллер вида (вы получаете вид контейнера из обычной палитры объектов/библиотеки)

enter image description here

действия:

  1. есть вид (ViewForContainer на рис.), который содержит этот вид контейнера, чтобы затемнить его, когда содержимое вида контейнера отображается. Подключите розетку внутри первого контроллера вида

  2. скрыть это представление при загрузке 1-го VC

  3. показывать при нажатии кнопки enter image description here

  4. чтобы затемнить это представление при отображении содержимого представления контейнера, установите фон представления на черный и непрозрачность 30%

enter image description here

вы получите этот эффект при нажатии на кнопку кнопка enter image description here

Comments

    Ничего не найдено.