Я пытаюсь создать собственный alertView (для iOS7 +) самостоятельно, но у меня проблемы с представлением alertView.
У меня есть 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 в фоновом режиме, как и предполагалось, но когда анимация заканчивается, представляющий VC удаляется из фона.
Если вместо этого я вызываю [transitionContext completeTransition:YES];, представляющий VC находится в фоновом режиме, но модальный VC удаляется в конце анимации, поэтому я предполагаю, что контекст отменяет презентацию, если мы отправим "НЕТ".
Есть ли способ сохранить представляющий VC в фоновом режиме без необходимости делать его снимок и устанавливать его в качестве фона для модального представления VC?
Ответ 1 · рейтинг 42 · Basem Saadawy
Я пробовал это решение, и оно работает как на 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" и "presentViewController".
Ответ 4 · рейтинг 1 · Trenskow
Я думаю, что вы видите стандартное поведение 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 · рейтинг 1 · Imotep
К вашему сведению, я наконец сделал свой собственный alertView подклассом UIView для "части popUp". Чтобы показать это, я просто добавляю alertView в качестве подпредставления keyWindow с ограничениями для его центрирования и помещаю за ним прозрачный черный фоновый вид.
Поскольку это не контроллер, мне приходится самостоятельно управлять ротацией пользовательского интерфейса (только для iOS 7 он хорошо сочетается с пользовательским интерфейсом в iOS 8).