Представить прозрачный модальный UIViewController

Я пытаюсь создать собственное alertView (для iOS7 +) самостоятельно, но я борюсь с презентацией alertView.

У меня есть UIViewController с черным фоном (альфа, установленным на 0.25f), и alertView как subview.

Когда я хочу показать alertView, я представляю модально viewController:

-(void) show 
{
    UIWindow* window = [[UIApplication sharedApplication] keyWindow];
    self.modalTransitionStyle = UIModalPresentationCustom;
    self.transitioningDelegate = self;
    [window.rootViewController presentViewController:self animated:YES completion:nil];
}

И вот мой объект аниматора:

-(NSTimeInterval) transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext
{
    NSLog(@"%s",__PRETTY_FUNCTION__);
    return 2;
}

-(void) animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
    NSLog(@"%s",__PRETTY_FUNCTION__);

    UIView* toView = [transitionContext viewForKey:UITransitionContextToViewKey];
    toView.alpha = 0;

    UIView* container = [transitionContext containerView];
    [container addSubview:toView];

    [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
        toView.alpha = 0.5;
    } completion:^(BOOL finished) {
        [transitionContext completeTransition:YES];
    }];
}

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

Если вместо [transitionContext completeTransition:YES]; я вызываю [transitionContext completeTransition:YES];, представляющий VC находится в фоновом режиме, а модальный VC удаляется в конце анимации, поэтому я предполагаю, что контекст отменяет презентацию, если мы отправляем "NO".

Есть ли способ сохранить отображающий VC в фоновом режиме, не делая его моментального снимка и задав его как фон модального просмотра VC?

Ответ 1

Для информации, Я, наконец, сделал свой собственный alertView подклассом UIView для "popUp part". Чтобы показать это, я просто добавляю alertView в качестве подзаголовка keyWindow с ограничениями, чтобы сосредоточить его, и поместил на него прозрачный черный фон.

Поскольку это не контроллер, мне приходится управлять вращением UI самостоятельно (только для iOS 7, он хорошо вращается с пользовательским интерфейсом в iOS 8).

Ответ 2

Я пробовал это решение и работает как на iOS 7, так и на 8:

if ([[UIDevice currentDevice].systemVersion integerValue] >= 8)
{
    //For iOS 8
    presentingViewController.providesPresentationContextTransitionStyle = YES;
    presentingViewController.definesPresentationContext = YES;
    presentedViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;
}
else
{
    //For iOS 7
    presentingViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
}

Примечание: Имейте в виду разницу между "presentingViewController" и "представленным контролером".

Ответ 3

iOS8 +

Для iOS8 + вы можете использовать ниже фрагмент кода

SecondViewController *secondViewController = [[SecondViewController alloc] init];
secondViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;           
[self presentViewController:secondViewController animated:YES completion:nil];    

Ответ 4

Мое дело может отличаться от вашего, но информация может быть полезной для разговора.

В "Раскадке" я сменил мою презентацию "Снег" на "Over Full Screen", и она сделала трюк.

Ответ 5

Я думаю, что то, что вы видите, это поведение iOS по умолчанию.

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

Я думаю, что ваше единственное решение - сделать пользовательскую презентацию.

Примечание: Я не тестировал это. Но это происходит примерно так.

/* Create a window to hold the view controller. */
UIWindow *presenterWindow = [[UIWindow alloc] init];

/* Make the window transparent. */
presenterWindow.backgroundColor = [UIColor clearColor];
presenterWindow.opaque = NO;

/* Set the window rootViewController to the view controller you
   want to display as a modal. */
presenterWindow.rootViewController = myModalViewController;

/* Setup animation */
CGRect windowEndFrame = [UIScreen mainScreen].bounds;
CGRect windowStartFrame = windowEndFrame;

/* Adjust the start frame to appear from the bottom of the screen. */
windowStartFrame.origin.y = windowEndFrame.size.height;

/* Set the window start frame. */
presenterWindow.frame = windowStartFrame;

/* Put the window on screen. */
[presenterWindow makeKeyAndVisible];

/* Perform the animation. */
[UIView animateWithDuration:0.5
                      delay:.0
                    options:UIViewAnimationOptionCurveEaseOut
                 animations:^{
                     presenterWindow.frame = windowEndFrame;
                 }
                 completion:^(BOOL finished){
                     /* Your transition end code */
                 }];

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

Ответ 6

ViewController не должен быть прозрачным, когда вы представляете его или нажимаете. Вы можете попробовать добавить его как subview. И для эффекта перехода измените его рамку сразу после добавления в качестве подсмотра. Сделайте свою рамку где-то вне видимого вида, а затем оставьте ее, чтобы изменить рамку на видимый вид.

Надеюсь, что это поможет.