iOS: Modal ViewController з прозорим фоном


180

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

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

Я знаю, що міг би просто додати погляд як підпідгляд, але я хотів би чомусь уникнути цього рішення. Як я можу це виправити?


4
@ Звучить так, як Майкл, як і я, хоче, щоб модальний вигляд був напівпрозорим і виглядав як ширячий шар гелю над первинним (подаючим) поданням. Створює відчуття того, що користувач залишається в поточному контексті під час швидкого налаштування, на відміну від виходу на деякі інші основні функціональні можливості (в окремому вікні).
Василь Бурк

Цей 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для представленого модального представлення стилю ViewController. Це також охоплюватиме кнопки навігації та навігації.


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.

Це можна зробити за допомогою коду, або встановивши властивості segue у дошці.

З документації UIViewController:

UIModalPresentationOverCurrentContext

Стиль презентації, де вміст відображається лише над вмістом контролера батьківського перегляду. Перегляди під представленим вмістом не видаляються з ієрархії подання, коли презентація закінчується. Отже, якщо представлений контролер перегляду не заповнює екран непрозорим вмістом, базовий вміст відображається наскрізь.

Під час подання контролера перегляду в поточному режимі цей стиль подання підтримується лише в тому випадку, якщо стиль переходу є UIModalTransitionStyleCoverVertical. Спроба використовувати інший стиль переходу викликає виняток. Однак ви можете використовувати інші стилі переходу (за винятком часткового переходу згортання), якщо контролер перегляду батьків не перебуває в переході.

Доступно в iOS 8.0 та новіших версіях.

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

Відео "Перегляд досягнень контролера у iOS 8" від WWDC 2014 детально описується в цьому.

Примітка:

  • Обов’язково надайте представленому контролеру подання чіткий колір фону, щоб він насправді не проглянувся!
  • Ви повинні встановити це перед тим, як представляти, тобто встановлення цього параметра в viewDidLoadпредставленомуViewController не вплине

32
Примітка. З'являється ціль, де потрібно встановити modalPresentationStyle змінилася. Наприклад, в iOS 7, щоб змусити це працювати, мені потрібно було встановити modalPresentationStyle контролерів перегляду, які намагалися відкрити модаль для UIModalPresentationCurrentContext . Однак, щоб це працювало в iOS8, мені потрібно було встановити modalPresentationStyle модального перегляду, який буде відображатися у UIModalPresentationOverCurrentContext .
u2Fan

1
Якщо ви використовуєте сеги у ваших дошках, вам слід встановити стиль викладу. Принаймні, це те, що працювало для мене.
Джуліан Б.

Я додав ці три рядки методом init у представлений контролер подання і працює як шарм: self.providesPresentationContextTransitionStyle = YES; self.definesPresentationContext = ТАК; [self setModalPresentationStyle: UIModalPresentationOverCurrentContext];
inigo333

2
У iOS 8+ мені довелося подати модаль від UINavigationController, тому подання від дитини не забезпечило мені те, що мені потрібно. Натомість sourceVCє self.navigationController. Крім того, лише встановивши цільовий стиль презентації як звичайний, я міг переглядати його. [sourceVC setModalPresentationStyle:UIModalPresentationCurrentContext];, [targetVC setModalPresentationStyle:UIModalPresentationCustom];Сподіваємось, це комусь допоможе.
devdc

Примітка - Зателефонуйте presentedVC.modalPresentationStyle = UIModalPresentationOverCurrentContextв представлений ЦК. Не працює у представленому ВК. Повірте, я спробував.
усмішка

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];

Див. Зображення, що додається


5
Це єдине рішення, на яке я міг би працювати. Також дуже просто. Просто додайте це до Вашого представленого ВК перед модальним стихом.
Сірісс

1
Xcoe 9.2 / iOS 11.2 швидко .customі .overFullScreenпрацюйте.
Вільям Ху

Здається, якщо встановити .overFullScreenпоточний вигляд контролера, viewWillAppearто не буде викликано.
Вільям Ху

Ще одна річ, presentedController.view.backgroundColor = #color#повинна бути написана в presentedControllerросійській мові viewDidLoad, інакше presentedControllerжиття перерветься.
Світанок

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
    }
}

7
Підтверджено це працює. Зверніть увагу, що якщо ваш viewController знаходиться у навігаційному контролері, то переконайтесь, що його modalPresentationStyleтакож встановлено!
mxcl

Я думаю, що в найпоширеніших випадках добре ставитися до вашого навігаційного контролера як до представленого VC.
malex

Так, за допомогою цього modalPresentationStyle неможливо отримати презентуючу анімацію ((
malex

2
@alex так, це шкода: моя помилка була в тому, щоб встановити modalPresentationStyle на UIModalPresentationCurrentContext для представленого VC замість prenstingVC.
tiguero

5
@mxcl І якщо навігація вашого viewController сама знаходиться у вкладціBarController, тоді переконайтеся, що її modalPresentationStyle встановлена;)
Thomas CG de Vilhena

21

Я трохи поборовся з Інтерфейс-конструктором XCode 7, щоб встановити стиль презентації, як запропонував @VenuGopalTewari. У цій версії, здається, немає Over Current Contextабо Over Full Screenрежиму презентації для segue. Таким чином, щоб він працював, я встановив режим Default:

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

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

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


Це працювало для мене, код не потрібен. Я використовую Xcode 7.2, швидкий, а мета - iOS 8.0
LightMan

Це працювало і для мене. +1 за правильну відповідь. Дякую :)
Августин ПА

Найкраща відповідь тут!
shinyuX

1
Без коду = Найкраща відповідь. Бастіан виграє цю гру. Plz всім +1 відповідь.
GeneCode

Ця відповідь спрацювала ... витрачаючи на це більше години
користувач578386

18

Створіть segue для модального представлення та встановіть властивість Presentation цього segue у поточному контексті, воно буде працювати 100%

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


3
Я захоплююсь 100% впевненими, це спрацювало! Ключовим є нанесення його на segue. Дякую велике
Badr

Якщо у вас немає підключеної програми до кнопки, і ви викликаєте її програмно, тоді переконайтесь, що встановіть ідентифікатор і зателефонуйте виконуватиSegueWithIdentifier замість присутньогоViewController
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


Дякую - це саме те, що мені було потрібно - показуючи початковий екран "Довідка" вгорі головного Домашнього. Гарний!
Метт Х

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

M файл

@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

Вирішення цієї відповіді за допомогою швидкого було б наступним.

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) повинні мати однаковий рівень / ієрархію. Не робіть перегляд зображення дитиною подання, інакше непрозорість uiview буде впливати на UIView (2))
  1. Представити V2 модально

  2. Клацніть segue. У інспекторі атрибутів встановіть презентацію як на весь екран . Видаліть анімацію, якщо хочете

Дошка розкадрувань

  1. Виберіть V2. У інспекторі атрибутів встановіть презентацію як на весь екран . Перевірка Визначає контекст і надає контекст

Дошка розкадрувань

  1. Виберіть головний вигляд свого V2 (Pls. Перевірте зображення). Встановіть backgroundColor на Clear Color

Дошка розкадрувань


6

Я додав ці три рядки методом init у представлений контролер подання, і він працює як шарм:

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

EDIT (працює на iOS 9.3):

self.modalPresentationStyle = UIModalPresentationOverFullScreen;

Відповідно до документації:

UIModalPresentationOverFullScreen Стиль презентації перегляду, у якому поданий вигляд охоплює екран. Перегляди під представленим вмістом не видаляються з ієрархії подання, коли презентація закінчується. Отже, якщо представлений контролер перегляду не заповнює екран непрозорим вмістом, базовий вміст відображається наскрізь.

Доступно в iOS 8.0 та новіших версіях.


1
Робота над iOS 10.2.
Йозеф Рісанек

4

Альтернативний спосіб - використовувати "перегляд контейнера". Просто зробіть альфа нижче 1 і вставте з секею. 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модально, але з прозорим фоном.


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)
    }
}

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;
}

2

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

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

Якщо ви використовуєте модальний segue, не забудьте встановити його як це зображення (ви можете вимкнути анімацію, якщо хочете)введіть тут опис зображення


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

1

Швидкий 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:^{

    }];

у наступномуViewController, який потрібно додати прозоро:

- (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];
}

0

Екран для входу є модальним, тобто він розташовується вгорі попереднього екрана. Поки ми розмитість фону, але це нічого не розмиває; це просто сірий фон.

Нам потрібно правильно встановити наш Модал.

зображення посилання цілі

  • По-перше, нам потрібно змінити фон View View Controller на Clear color. Це просто означає, що він повинен бути прозорим. За замовчуванням цей Вид білий.

  • По-друге, нам потрібно вибрати Segue, що веде до екрана входу, і в інспекторі атрибутів встановити презентацію на "Над поточним контекстом". Ця опція доступна лише з увімкненими класами автоматичного розміщення та розміру.

зображення посилання цілі


0

Встановити навігацію modalPresentationStyleнаUIModalPresentationCustom

і встановіть колір тла представленого контролера перегляду як чіткий колір.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.