Прозрачный модальный вид на контроллере навигации - PullRequest
71 голосов
/ 11 мая 2009

Я пытаюсь создать прозрачный модальный вид поверх моего контроллера навигации. Кто-нибудь знает, возможно ли это?

Ответы [ 19 ]

2 голосов
/ 26 апреля 2010

Я наконец достиг этого, для интерфейса навигации или панели вкладок, комбинируя контроллер представления наложения (см. Ответ pix0r), который скрыт / не скрыт перед тем, как скрыть или показать контроллер представления на основе этого очень хорошего блога почта .

Что касается контроллера представления, совет состоит в том, чтобы сделать его фоновый вид clearColor, тогда полупрозрачный вид наложения будет видимым, и любые виды, добавляемые как подпредставления в контроллере представления, находятся спереди и, что наиболее важно, непрозрачны.

2 голосов
/ 23 апреля 2012

Я получил эту идею от https://gist.github.com/1279713

Подготовка: В модальном представлении xib (или сцене с использованием раскадровки) я настраиваю полноэкранный фоновый UIImageView (подключите его к файлу .h и присвойте ему свойство "backgroundImageView") с 0,3 альфа. И я установил цвет фона представления (UIView) как простой черный.

Идея: Затем в «viewDidLoad» модального контроллера представления я делаю снимок экрана из исходного состояния и устанавливаю это изображение в качестве фона UIImageView. Установите начальную точку Y на -480 и дайте ей сдвинуться до точки Y, используя длительность 0,4 секунды с опцией анимации EaseInOut. Когда мы отклоняем контроллер представления, просто делаем обратное.

Код для класса контроллера модального вида

.h файл:

@property (weak, nonatomic) IBOutlet UIImageView *backgroundImageView;
- (void) backgroundInitialize;
- (void) backgroundAnimateIn;
- (void) backgroundAnimateOut;

.m файл:

- (void) backgroundInitialize{
    UIGraphicsBeginImageContextWithOptions(((UIViewController *)delegate).view.window.frame.size, YES, 0.0);
    [((UIViewController *)delegate).view.window.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage * screenshot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    backgroundImageView.image=screenshot;
}
- (void) backgroundAnimateIn{
    CGRect backgroundImageViewRect = backgroundImageView.frame;
    CGRect backgroundImageViewRectTemp = backgroundImageViewRect;
    backgroundImageViewRectTemp.origin.y=-480;
    backgroundImageView.frame=backgroundImageViewRectTemp;

    [UIView animateWithDuration:0.4 delay:0.0 options:UIViewAnimationCurveEaseInOut animations:^{
        backgroundImageView.frame=backgroundImageViewRect;
    } completion:^(BOOL finished) {

    }];
}
- (void) backgroundAnimateOut{
    CGRect backgroundImageViewRect = backgroundImageView.frame;
    backgroundImageViewRect.origin.y-=480;

    [UIView animateWithDuration:0.4 delay:0.0 options:UIViewAnimationCurveEaseInOut animations:^{
        backgroundImageView.frame=backgroundImageViewRect;
    } completion:^(BOOL finished) {

    }];
}

В viewDidLoad просто позвоните:

[self backgroundInitialize];
[self backgroundAnimateIn];

В любом месте, где мы отклоняем модальный контроллер вида, мы вызываем:

[self backgroundAnimateOut];

Обратите внимание, что это ВСЕГДА анимирует фоновое изображение. Поэтому, если этот стиль перехода контроллера модального представления (или стиль перехода segue) не установлен на «Cover Vertical», вам может не понадобиться вызывать методы анимации.

1 голос
/ 10 августа 2013

Я создал открытую библиотеку soruce MZFormSheetController для представления листа модальной формы в дополнительном окне UIWindow. Вы можете использовать его для представления контроллера прозрачности модального вида, даже настроить размер представленного контроллера представления.

1 голос
/ 16 сентября 2015

Для iOS 8+ вы можете использовать UIModalPresentationOverCurrentContext стиль представления для представленного контроллера просмотра для легкого достижения желаемого поведения.

UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.9f];
viewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;
[self presentViewController:viewController animated:YES completion:nil];

Если вам также нужна поддержка iOS 7 - отметьте этой веткой .

0 голосов
/ 26 апреля 2015

Это сработало для меня:

UIViewController *modalViewController = [[UIViewController alloc] init];
modalViewController.view.backgroundColor = [UIColor whiteColor] colorWithAlpha:0.5];
[self showDetailViewController:modalViewController sender:nil];
0 голосов
/ 18 октября 2014

Если вы говорите, что хотите наложение экрана, используйте parentViewController.view, он будет расположен над панелью навигации ++

MyCustomViewController* myOverlayView = [[MyCustomViewController alloc] init]; [self.parentViewController.view addSubview:myOverlayView];

0 голосов
/ 28 февраля 2014

Если вам нужен экран, подобный приложенному, вам может помочь приведенный ниже код. enter image description here

Код:

MyViewController * myViewController = [[MyViewController alloc] initWithNibName:nibName bundle:nil];
UINavigationController * myNavigationController = [[UINavigationController alloc] initWithRootViewController: myViewController];
myNavigationController.modalPresentationStyle = UIModalPresentationPageSheet;
[self presentModalViewController: myNavigationController animated:YES];
0 голосов
/ 29 октября 2012

Я только что нашел обходной путь для этого. Просто создайте 1X1 UIViewController и добавьте его в свой родительский контроллер представления. И покажите прозрачный модальный контроллер вида в этом UIViewController.

on viewDidLoad;

self.dummyViewController = [[UIViewController alloc] init]; [self.dummyViewController.view setFrame: CGRectMake (0, 0, 1, 1)]; [self.view addSubView: self.dummyViewController.view];

когда вам нужно открыть прозрачный ViewController;

[self.

0 голосов
/ 29 января 2010

Вы можете добиться прозрачного / полупрозрачного эффекта модального вида, наложив прозрачную / полупрозрачную кнопку как на панели просмотра, так и на панели навигации.

Вы можете получить доступ к панели навигации через свойство navigationBar UINavigationController.

Я обнаружил, что UIButton, в отличие от UILabel, будет перехватывать события мыши, что дает правильное модальное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...