12

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

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

Когда я хочу показать 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 удаляется из фона.

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

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

+0

Возможный дубликат http://stackoverflow.com/questions/22003967/is-it-possible-to-use- ios-7-uiviewcontroller-transitions-interactive-specificical/22285013 # 22285013? –

+0

vc.modalPresentationStyle = UIModalPresentationOverFullScreen; –

ответ

0

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

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

0

Я думаю, что то, что вы видите, является поведением 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 с экрана.

+0

Глядя на http://stackoverflow.com/questions/11236367/display-clearcolor-uiviewcontroller-over-uiviewcontroller/11252969#11252969, а точнее на https://github.com/hightech/iOS-7-Custom-ModalViewController -Переключения, я думаю, что это должно работать. И что более важно, в начале моего alertView было просто представление, которое я добавил в окно приложения, но представление не вращалось. Поэтому я завернул его в VC, чтобы помочь ему справиться с поворотом. Я думаю, что поворот не обрабатывается вашим решением. – Imotep

0

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

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

+0

Если я добавлю его в качестве подвид окна, он не будет вращаться с пользовательским интерфейсом, и если я добавлю его как подпункт верхнего VC, прозрачный фон не будет охватывать весь пользовательский интерфейс. – Imotep

33

Я попытался это решение, и он работает на обоих прошивкой 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' и 'presentedViewController' ,

+3

Как, черт возьми, у вас нет никаких повышений? Это лучший ответ когда-либо – jovanjovanovic

+2

Для полноэкранного просмотра (особенно при представлении из 'UINavigationController') используйте' ПредставленныйViewController.modalPresentationStyle = UIModalPresentationOverFullScreen; ' – tomec

+0

Вы классный. @tomec –

1

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

В раскадровке я презентовал презентацию segue для презентации «Over Full Screen», и это сделало трюк.

+0

Большое спасибо .. – MacKa

4

iOS8 +

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^