iOS: модальный ViewController с прозрачным фоном

180

Я пытаюсь представить контроллер представления модально, с прозрачным фоном. Моя цель - сделать так, чтобы представление текущего и представленного контроллеров представления отображалось одновременно. Проблема в том, что когда представление анимации заканчивается, представление контроллера представления исчезает.

- (IBAction)pushModalViewControllerButtonPressed:(id)sender
{
    ModalViewController *modalVC = [[ModalViewController alloc] init];
    [self presentViewController:modalVC animated:YES completion:nil];
}

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

Майкл
источник
4
@TheKing Звучит так, как Майкл, как и я, хочет, чтобы модальный вид был полупрозрачным, чтобы он выглядел как слой парящего геля над основным (представительным) видом. Создает ощущение, что пользователь остается в текущем контексте при быстрой настройке, в отличие от перехода к некоторым другим основным функциям (в отдельном представлении).
Василий Бурк
Этот stackoverflow.com/q/27598846/1603234 заставляет меня улыбаться, теперь ваша очередь :)
Hemang
Смотрите мой ответ здесь stackoverflow.com/a/29794201/1606125 для iOS 8
Pankaj Wadhwa
Быстрая версия здесь stackoverflow.com/a/34578402/3380878
Mojtabye
1
Для iOS 10 работает UIModalPresentationOverFullScreen, как указано в inigo333 ниже.
Йозеф Рысанек

Ответы:

97

Этот следующий код работает только на iPad.

self.view.backgroundColor = [UIColor clearColor];
self.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentModalViewController:modalVC animated:YES];

Я бы пошел с добавлением подпункта.

Здесь очень хорошая дискуссия. Посмотрите на комментарии конкретно. Не только ответ.

Модальный вид

Если бы я был тобой, я бы этого не делал. Я бы добавил подпункт и сделал бы это. Кажется, это дает мне лучший контроль над вещами.

РЕДАКТИРОВАТЬ:

Как упомянул Пол Линсей, начиная с iOS 8, все, что нужно, - UIModalPresentationOverFullScreenэто использовать modalPresentationStyle представляемого ViewController. Это будет также охватывать кнопки навигации и вкладки.

SP
источник
18
Это делает работу по прошивке 7 , а также на iPhone, дело в том , что вы должны указать modalPresentationStyle = UIModalPresentationCurrentContextна ведущий контроллере представления, а не в представленных одной.
redent84
6
Да, это работает, но ТОЛЬКО если вы установите это на более высоком уровне ViewController иерархии вашего представления. (например, a NavigationControllerили экземпляр вашего контроллера представления слайд-меню, например).
iGranDav
4
Странно, но в моем случае это сработало только после установки модального стиля на UIModalPresentationCustom, и только если он установлен прямо перед, presentViewControllerа не в viewDidLoad.
Моджуба
5
Начиная с iOS 8, все, что нужно, это UIModalPresentationOverFullScreen для modalPresentationStyle представляемого ViewController.
Пол Линсей
1
Примерно после 1000 попыток я понял, что вам нужно установить modalPresentationStyle раньшеviewDidLoad . Я сделал это в конструкторе, и это сработало.
bendytree
186

Для тех, кто пытается заставить это работать в iOS 8, «одобренный Apple» способ отобразить прозрачный контроллер модального вида - установить modalPresentationStyle на текущем контроллере ed значение UIModalPresentationOverCurrentContext.

Это можно сделать в коде или установив свойства перехода в раскадровке.

Из документации UIViewController:

UIModalPresentationOverCurrentContext

Стиль представления, в котором содержимое отображается только над содержимым контроллера родительского представления. Представления под представленным содержимым не удаляются из иерархии представлений по окончании презентации. Таким образом, если представленный контроллер представления не заполняет экран непрозрачным контентом, базовый контент просвечивает.

При представлении контроллера представления во всплывающем окне этот стиль представления поддерживается только в том случае, если стиль перехода - UIModalTransitionStyleCoverVertical. Попытка использовать другой стиль перехода вызывает исключение. Тем не менее, вы можете использовать другие стили перехода (кроме частичного перехода curl), если родительский контроллер представления не находится во всплывающем окне.

Доступный в iOS 8.0 и позже.

https://developer.apple.com/documentation/uikit/uiviewcontroller

Видеоролик «Просмотр улучшений контроллера в iOS 8» с WWDC 2014 подробно расскажет об этом.

Примечание:

  • Убедитесь, что ваш представленный контроллер представления имеет четкий цвет фона, чтобы он не был прозрачным!
  • Вы должны установить это перед представлением, т.е. установка этого параметра в viewDidLoadпредставленном представлении ControlController не окажет никакого влияния
Джефф С.
источник
32
Примечание. Похоже, цель, для которой вам нужно установить modalPresentationStyle , изменилась. Например, в iOS 7, чтобы заставить это работать, мне нужно было установить modalPresentationStyle View Controller (s), который пытался открыть модальное UIModalPresentationCurrentContext . Однако, чтобы заставить это работать в iOS8, мне нужно было установить modalPresentationStyle модального представления, которое будет отображаться в UIModalPresentationOverCurrentContext .
u2Fan
1
Если вы используете сегменты в своих раскадровках, вы должны установить там стиль презентации. По крайней мере, это то, что сработало для меня.
Джулиан Б.
Я добавил эти три строки в методе init в представленном контроллере представления и работает как шарм: self.providesPresentationContextTransitionStyle = YES; self.definesPresentationContext = YES; [self setModalPresentationStyle: UIModalPresentationOverCurrentContext];
inigo333
2
На iOS 8+ я должен был представить модальное изображение из UINavigationController, поэтому представление от ребенка не дало мне то, что мне было нужно. Вместо этого sourceVCесть self.navigationController. Кроме того, только после установки целевого стиля презентации в качестве пользовательского, я мог видеть сквозь него. [sourceVC setModalPresentationStyle:UIModalPresentationCurrentContext];, [targetVC setModalPresentationStyle:UIModalPresentationCustom];Надеюсь , это поможет кому - то.
devdc
Примечание - Вызов presentedVC.modalPresentationStyle = UIModalPresentationOverCurrentContextв представляя ВК. Не работает в представленном ВК. Поверь мне, я пытался.
smileham
104

В iOS 8.0 и выше это можно сделать, установив свойство modalPresentationStyle значение UIModalPresentationOverCurrentContext.

//Set property **definesPresentationContext** YES to avoid presenting over presenting-viewController's navigation bar

self.definesPresentationContext = YES; //self is presenting view controller
presentedController.view.backgroundColor = [YOUR_COLOR with alpha OR clearColor]
presentedController.modalPresentationStyle = UIModalPresentationOverCurrentContext;

[self presentViewController:presentedController animated:YES completion:nil];

Смотрите изображение в приложении

sat20786
источник
5
Это единственное решение, которое я мог получить на работу. Очень просто. Просто добавьте это к вашему выступлению перед модальным переходом.
Сирисс
1
Xcoe 9.2 / iOS 11.2 быстр .customи .overFullScreenработает.
Уильям Ху,
И, кажется, если вы установите .overFullScreenтекущий контроллер вид viewWillAppearне будет вызываться.
Уильям Ху,
Еще одна вещь, presentedController.view.backgroundColor = #color#должно быть написано в presentedController«х viewDidLoad, или же presentedController» s жизнь прерывается.
DawnSong
44

Этот код отлично работает на iPhone под iOS6 и iOS7:

presentedVC.view.backgroundColor = YOUR_COLOR; // can be with 'alpha'
presentingVC.modalPresentationStyle = UIModalPresentationCurrentContext;
[presentingVC presentViewController:presentedVC animated:YES completion:NULL];

В этом случае вы пропустите слайд-анимацию. Чтобы сохранить анимацию, вы все равно можете использовать следующее «не элегантное» расширение:

[presentingVC presentViewController:presentedVC animated:YES completion:^{
    [presentedVC dismissViewControllerAnimated:NO completion:^{
        presentingVC.modalPresentationStyle = UIModalPresentationCurrentContext;
        [presentingVC presentViewController:presentedVC animated:NO completion:NULL];
    }];
}];

Если наше представление V находится внутри UINavigationController или UITabbarController, вам нужно работать с этими контроллерами как с представлением VC.

Кроме того, в iOS7 вы можете реализовать собственный UIViewControllerTransitioningDelegateпротокол применения анимации перехода . Конечно, в этом случае вы можете получить прозрачный фон

@interface ModalViewController : UIViewController <UIViewControllerTransitioningDelegate>

Во-первых, перед представлением вы должны установить modalPresentationStyle

modalViewController.modalPresentationStyle = UIModalPresentationCustom;

Затем вы должны реализовать два метода протокола

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
{
    CustomAnimatedTransitioning *transitioning = [CustomAnimatedTransitioning new];
    transitioning.presenting = YES;
    return transitioning;
}

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
{
    CustomAnimatedTransitioning * transitioning = [CustomAnimatedTransitioning new];
    transitioning.presenting = NO;
    return transitioning;
}

Последнее, что нужно сделать, это определить свой пользовательский переход в CustomAnimatedTransitioningклассе.

@interface CustomAnimatedTransitioning : NSObject <UIViewControllerAnimatedTransitioning>
@property (nonatomic) BOOL presenting;
@end

@implementation CurrentContextTransitionAnimator

- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext 
{
    return 0.25;
}

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext 
{
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    if (self.presenting) {
        // custom presenting animation
    }
    else {
        // custom dismissing animation
    }
}
Malex
источник
7
Подтвердил, что это работает. Примечание , что , если ваш ViewController находится внутри navigationController затем обеспечить его modalPresentationStyleустановлен также!
mxcl
Я думаю, что в наиболее распространенных случаях хорошей идеей будет рассматривать ваш навигационный контроллер как презентацию VC.
Малекс
Да, используя этот modalPresentationStyle невозможно получить представление анимации ((
malex
2
@alex да, это работает, извините: моя ошибка состояла в том, чтобы установить modalPresentationStyle в UIModalPresentationCurrentContext для представленного VC вместо prenstingVC.
Тигуэро
5
@mxcl И если ваш viewController navigationController сам находится внутри tabBarController, убедитесь, что его modalPresentationStyle также установлен;)
Thomas CG de Vilhena
21

Я немного боролся с Интерфейсным Разработчиком XCode 7, чтобы установить Стиль Представления, как предложил @VenuGopalTewari. В этой версии, кажется, нет режима презентации Over Current Contextили Over Full Screenдля segue. Таким образом, чтобы это работало, я установил режим Default:

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

Дополнительно я установил режим представления модально представленного контроллера представления на Over Full Screen:

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

Бастиан
источник
Это сработало для меня, код не нужен. Я использую Xcode 7.2, swift и цель - iOS 8.0
LightMan
Это сработало и для меня. +1 за правильный ответ. Спасибо :)
Августин ПА
Лучший ответ здесь!
shinyuX
1
Нет кода = Лучший ответ. Бастиан выигрывает эту игру. Плз +1 всем этот ответ.
GeneCode
Этот ответ сработал .. потратив на это больше часа
user578386
18

Создайте последовательность для модального представления и установите свойство Presentation для этого перехода в текущем контексте, оно будет работать на 100%

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

Вену Гопал Тевари
источник
3
Я восхищаюсь 100% уверенными, это сработало! Ключ заключается в том, чтобы применить его на Segue. Большое спасибо
Бадр
Если вы не подключили segue к кнопке и вызываете ее программно, убедитесь, что вы установили идентификатор и вызвали executeSegueWithIdentifier вместо presentViewController
user3344977
1
Я попробовал все остальные ответы, но это единственный, который работал для меня в iOS9.
Endavid
14

PresentViewController с прозрачным фоном - в iOS 8 и iOS 9

MYViewController *myVC = [self.storyboard   instantiateViewControllerWithIdentifier:@"MYViewController"];
    myVC.providesPresentationContextTransitionStyle = YES;
    myVC.definesPresentationContext = YES;
    [myVC setModalPresentationStyle:UIModalPresentationOverCurrentContext];
    [self.navigationController presentViewController:myVC animated:YES completion:nil];

А в MYViewController установить черный цвет фона и уменьшить непрозрачность

Ашвини Чугале
источник
12

Это немного странно, но для меня этот код работает (iOS 6):

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

[self presentViewController:self.signInViewController animated:YES completion:^{
    [self.signInViewController dismissViewControllerAnimated:NO completion:^{
        appDelegate.window.rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
        [self presentViewController:self.signInViewController animated:NO completion:nil];
        appDelegate.window.rootViewController.modalPresentationStyle = UIModalPresentationFullScreen;

    }];
}];

Этот код работает и на iPhone

Mak
источник
Спасибо - это именно то, что мне было нужно - показ начального экрана «Справка» в верхней части главного экрана. Прекрасный!
Мэтт Х
1
Сегодня я провожу почти 3 часа в поисках решения, которое работает как для iOS7, так и для iOS8. Учитывая тот факт, что этому ответу 1,5 года, и я использую ECSlidingViewController, это единственное решение, которое сработало! Спасибо @Mak.
Центурион
Отлично. Кроме того, если вы не заботитесь об анимации, 3 строки во внутреннем завершении отлично работают. Спасибо!
RasTheDestroyer
после 3 часов, проведенных безуспешно, нашел это, ура, жаль, что я не мог больше голосовать: D
alessioarsuffi
11

Эта категория работала для меня (IOS 7, 8 и 9)

H файл

@interface UIViewController (navigation)
- (void) presentTransparentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;
@end

М файл

@implementation UIViewController (navigation)
- (void)presentTransparentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
{
    if(SYSTEM_VERSION_LESS_THAN(@"8.0")) {
        [self presentIOS7TransparentController:viewControllerToPresent withCompletion:completion];

    }else{
        viewControllerToPresent.modalPresentationStyle = UIModalPresentationOverCurrentContext;
         [self presentViewController:viewControllerToPresent animated:YES completion:completion];
    }
}
-(void)presentIOS7TransparentController:(UIViewController *)viewControllerToPresent withCompletion:(void(^)(void))completion
{
    UIViewController *presentingVC = self;
    UIViewController *root = self;
    while (root.parentViewController) {
        root = root.parentViewController;
    }
    UIModalPresentationStyle orginalStyle = root.modalPresentationStyle;
    root.modalPresentationStyle = UIModalPresentationCurrentContext;
    [presentingVC presentViewController:viewControllerToPresent animated:YES completion:^{
        root.modalPresentationStyle = orginalStyle;
    }];
}
@end
Тед
источник
1
Я проверил все ответы .. но для меня ваш ответ - идеальная работа .. "+1" для этого. @Ted
g212gs
1
Я думал, что не могу найти решение. Большое спасибо!
CopperCash
10

Решение этого ответа с использованием Swift будет следующим.

let vc = MyViewController()
vc.view.backgroundColor = UIColor.clear // or whatever color.
vc.modalPresentationStyle = .overCurrentContext
present(vc, animated: true, completion: nil)
Энтони Дито
источник
9

Если вы используете раскадровку, вы можете выполнить этот шаг:

  1. Добавьте контроллер вида (V2), настройте пользовательский интерфейс так, как вы этого хотите
  • добавить UIView - установить фон черный и непрозрачность до 0,5
  • добавьте еще один UIView (2) - это будет служить вашим всплывающим окном (пожалуйста, обратите внимание, что UIView и UIView (2) должны иметь одинаковый уровень / иерархию. Не делайте imageview дочерним видом представления, в противном случае непрозрачность uiview будет влияет на UIView (2))
  1. Представьте V2 Модально

  2. Нажмите на переход. В инспекторе атрибутов установите представление как на весь экран . Удалить анимацию, если хотите

Раскадровка

  1. Выберите V2. В инспекторе атрибутов установите представление как на весь экран . Проверка определяет контекст и предоставляет контекст

Раскадровка

  1. Выберите MainView вашего V2 (пожалуйста, проверьте изображение). Установите backgroundColor в Clear Color

Раскадровка

dhin
источник
6

Я добавил эти три строки в методе init в представленном контроллере представления, и он работает как шарм:

self.providesPresentationContextTransitionStyle = YES;
self.definesPresentationContext = YES;
[self setModalPresentationStyle:UIModalPresentationOverCurrentContext];

РЕДАКТИРОВАТЬ (работает на iOS 9.3):

self.modalPresentationStyle = UIModalPresentationOverFullScreen;

Согласно документации:

UIModalPresentationOverFullScreen Стиль представления представления, в котором представленное представление закрывает экран. Представления под представленным содержимым не удаляются из иерархии представлений по окончании презентации. Таким образом, если представленный контроллер представления не заполняет экран непрозрачным контентом, базовый контент просвечивает.

Доступный в iOS 8.0 и позже.

inigo333
источник
1
Работа на iOS 10.2.
Йозеф Рысанек
4

Альтернативный способ - использовать «вид контейнера». Просто сделайте альфа ниже 1 и вставьте с помощью seque. XCode 5, цель iOS7. Проверено на iPhone.

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

Контейнерный вид доступен с iOS6. Ссылка на пост в блоге об этом.

Майк Глухов
источник
3

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

У него есть один простой метод, который делает это:

- (void)presentViewController:(UIViewController *)presentedViewController
       fromViewController:(UIViewController *)presentingViewController
{
    presentedViewController.modalPresentationStyle = UIModalPresentationCustom;
    presentedViewController.transitioningDelegate = self;
    presentedViewController.modalPresentationCapturesStatusBarAppearance = YES;

    [presentedViewController setNeedsStatusBarAppearanceUpdate];

    [presentingViewController presentViewController:presentedViewController
                                       animated:YES
                                     completion:nil];
}

Важно установить modalPresentationCapturesStatusBarAppearanceсвойство YESи принудительно обновить внешний вид строки состояния, если ваш представленный контроллер представления отличается preferredStatusBarStyle.

Этот объект должен иметь @property (assign, nonatommic) isPresenting

Вы хотите , чтобы этот объект соответствует Критериям UIViewControllerAnimatedTransitioningи UIViewControllerTransitioningDelegateпротоколов и реализовать следующие методы:

- (id)animationControllerForPresentedController:(UIViewController *)presented
                           presentingController:(UIViewController *)presenting
                               sourceController:(UIViewController *)source
{
    self.isPresenting = YES;

    return self;
}

- (id)animationControllerForDismissedController:(UIViewController *)dismissed
{
    self.isPresenting = NO;

    return self;
}

и:

- (NSTimeInterval)transitionDuration:(id)transitionContext
{
    return 0.25;
}

- (void)animateTransition:(id)transitionContext
{
    UIViewController* firstVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController* secondVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIView* containerView = [transitionContext containerView];
    UIView* firstView = firstVC.view;
    UIView* secondView = secondVC.view;

    if (self.isPresenting) {
        [containerView addSubview:secondView];
        secondView.frame = (CGRect){
            containerView.frame.origin.x,
            containerView.frame.origin.y + containerView.frame.size.height,
            containerView.frame.size
        };

        firstView.tintAdjustmentMode = UIViewTintAdjustmentModeDimmed;
        [UIView animateWithDuration:0.25 animations:^{
            secondView.frame = containerView.frame;
        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
        } else {
        [UIView animateWithDuration:0.25 animations:^{
            firstView.frame = (CGRect){
                containerView.frame.origin.x,
                containerView.frame.origin.y + containerView.frame.size.height,
                containerView.frame.size
        };

        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
    }
}

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

Важно то, что представление контроллера представления останется сзади, что позволит вам создать прозрачный эффект.

Это решение работает для iOS 7+

Педро Манчено
источник
Спасибо за Ваш ответ.
Салман Хаквани
3

Очень простой способ сделать это (используя Storyboards, например):

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"SomeStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SomeStoryboardViewController"];
// the key for what you're looking to do:
vc.modalPresentationStyle = UIModalPresentationOverCurrentContext;
vc.view.alpha = 0.50f;

[self presentViewController:vc animated:YES completion:^{
    // great success
}];

Это представит UIViewControllerв Storyboardмодально, но с прозрачным фоном.

JaredH
источник
3

Работа на iOS 7-10

if #available(iOS 8.0, *) {
    nextVC.modalPresentationStyle = .OverCurrentContext
    self.presentViewController(nextVC, animated: true, completion: nil)
} else {
    // Fallback on earlier version
    self.modalPresentationStyle = .Custom          
    nextVC.modalTransitionStyle = .CrossDissolve            
    self.presentViewController(nextVC, animated: false, completion: nil)
    }
}
iluvatar_GR
источник
2

Подводя итог всем хорошим ответам и комментариям здесь и сохраняя анимацию при переходе на новую, ViewControllerя сделал следующее: (поддерживает iOS 6 и выше)

Если вы используете UINavigationController\ UITabBarControllerэто путь:

    SomeViewController *vcThatWillBeDisplayed = [self.storyboard instantiateViewControllerWithIdentifier:@"SomeVC"];

    vcThatWillBeDisplayed.view.backgroundColor = [UIColor colorWithRed: 255/255.0 green:255/255.0 blue:255/255.0 alpha:0.50];    

    self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentViewController:presentedVC animated:YES completion:NULL];

Если вы сделаете это, вы потеряете свою modalTransitionStyleанимацию. Чтобы решить эту проблему, вы можете легко добавить в свой SomeViewControllerкласс это:

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [UIView animateWithDuration:0.4 animations:^() {self.view.alpha = 1;}
       completion:^(BOOL finished){}];
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.alpha = 0;
}
Segev
источник
2

Конечно, вы должны установить UIModalPresentationCurrentContext, но место для установки clearColor также очень важно! Вы не можете установить фон в функции viewDidLoad, установите его до того, как представление загрузилось, как в корневом контроллере представления или в функции инициализации контроллера, который будет представлен!

actionController.view.backgroundColor = [UIColor clearColor];
[self presentViewController:actionController animated:YES completion:nil];

или

- (instancetype)init {

    self = [super initWithNibName:nil bundle:nil];

    if(self) {
        self.modalPresentationStyle = UIModalPresentationOverCurrentContext;
        [self.view setBackgroundColor:[UIColor clearColor]];
    }

    return self;
}
Сантьяго
источник
Это был намек, который помог мне среди всех остальных. Спасибо за вашу помощь.
Томаш Назаренко
1

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

Ahmed
источник
1

Полный метод протестирован на iOS 7 и iOS 8.

@interface UIViewController (MBOverCurrentContextModalPresenting)

/// @warning Some method of viewControllerToPresent will called twice before iOS 8, e.g. viewWillAppear:.
- (void)MBOverCurrentContextPresentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;

@end

@implementation UIViewController (MBOverCurrentContextModalPresenting)

- (void)MBOverCurrentContextPresentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {
    UIViewController *presentingVC = self;

    // iOS 8 before
    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1) {
        UIViewController *root = presentingVC;
        while (root.parentViewController) {
            root = root.parentViewController;
        }

        [presentingVC presentViewController:viewControllerToPresent animated:YES completion:^{
            [viewControllerToPresent dismissViewControllerAnimated:NO completion:^{
                UIModalPresentationStyle orginalStyle = root.modalPresentationStyle;
                if (orginalStyle != UIModalPresentationCurrentContext) {
                    root.modalPresentationStyle = UIModalPresentationCurrentContext;
                }
                [presentingVC presentViewController:viewControllerToPresent animated:NO completion:completion];
                if (orginalStyle != UIModalPresentationCurrentContext) {
                    root.modalPresentationStyle = orginalStyle;
                }
            }];
        }];
        return;
    }

    UIModalPresentationStyle orginalStyle = viewControllerToPresent.modalPresentationStyle;
    if (orginalStyle != UIModalPresentationOverCurrentContext) {
        viewControllerToPresent.modalPresentationStyle = UIModalPresentationOverCurrentContext;
    }
    [presentingVC presentViewController:viewControllerToPresent animated:YES completion:completion];
    if (orginalStyle != UIModalPresentationOverCurrentContext) {
        viewControllerToPresent.modalPresentationStyle = orginalStyle;
    }
}

@end
BB9z
источник
1

Swift 4.2

guard let someVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "someVC") as? someVC else {
    return
}
someVC.modalPresentationStyle = .overCurrentContext

present(someVC, animated: true, completion: nil)
Алексей Шевченко
источник
0

в приложении:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[_window rootViewController]setModalPresentationStyle:UIModalPresentationCurrentContext];
    return YES;
}

у вас первый вид контроллера, откуда вы должны загрузить следующий вид:

  NextViewController *customvc = [[NextViewController alloc]init];
    [self presentViewController:customvc animated:YES completion:^{

    }];

в вашем nextViewController, который должен быть добавлен прозрачным:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor clearColor];
    UIView* backView = [[UIView alloc] initWithFrame:self.view.frame];
    backView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
    [self.view insertSubview:backView atIndex:0];
}
Zaraki
источник
0

Экран входа в систему является модальным, что означает, что он находится в верхней части предыдущего экрана. Пока у нас есть размытый фон, но он ничего не стирает; это просто серый фон.

Нам нужно правильно настроить наш модал.

целевая ссылка на изображение

  • Во-первых, нам нужно изменить фон View View Controller на Clear color. Это просто означает, что он должен быть прозрачным. По умолчанию этот вид является белым.

  • Во-вторых, нам нужно выбрать Segue, который ведет к экрану входа в систему, и в инспекторе атрибутов установить презентацию в текущий контекст. Этот параметр доступен только при включенных автоматических макетах и ​​классах размеров.

целевая ссылка на изображение

Тинкл
источник
0

Установить навигацию modalPresentationStyleнаUIModalPresentationCustom

и установите цвет фона представленного контроллера представления как чистый цвет.


источник