1

У меня есть относительно простой вопрос, который я не могу понять.Как создать прозрачный, модальный UIViewController на iPhone iOS7 +?

Я внутри UIViewController (myViewController), который встроен где-то внутри иерархии UIViewController (где-то под родительским UITabBarController).

myViewController имеет кнопку. Когда эта кнопка нажата, я хочу наложить весь экран (включая весь goo из родительского UITabBarController) с помощью черного, полупрозрачного, модального UIViewController (myModalViewController) с другим запуском на нем.

Если я просто позвонить

[myViewController presentViewController:myModalViewController..] 

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

Если установить myModalViewController в качестве контроллера представления ребенка о myViewController и добавить myModalViewController.view как подвид из myViewController.view, модальный контроллер представления с полупрозрачным черным фоном появляется под все кнопки на UITabBarController. Это плохо, потому что я хочу, чтобы весь экран был наложен.

Таким образом, вместо этого, я смотрю на самый верхний контроллер представления в иерархии и добавить myModalViewController как ребенок его таким образом:

UIViewController* root = myViewController; 
while (root.parentViewController) { 
    root = root.parentViewController; 
} 

[root addChildViewController:myModalViewController]; 
[root.view addSubview:myModalViewController.view]; 

Если это правильный способ справиться с этим сценарием? Кажется, клочья.

Также, как заставить myModalViewController вести себя модально и проглатывать все жесты касания, чтобы все пользовательские интерфейсы под ним не реагировали на касания? Сейчас это происходит, и все мои попытки исправить это потерпели неудачу. Кроме того, myModalViewController и все UIViews в нем, похоже, не получают никаких уведомлений о касании, что-то-то-всегда.

ответ

1

Если вы хотите прозрачный ViewController вы должны использовать UIModalPresentationCustom Что-то вроде этого ...

... 
[yourModalCtrl setModalPresentationStyle:UIModalPresentationCustom]; 
[yourModalCtrl setModalTransitionStyle:UIModalTransitionStyleCrossDissolve]; 
[self setModalPresentationStyle:UIModalPresentationCurrentContext]; //new 
//yourModalCtrl.modalPresentationCapturesStatusBarAppearance = YES; 
[self presentViewController: yourModalCtrl animated:Yes completion:completion]; 

[self presentViewController:....] или что ваш "Представляя контроллер" ...

http://b2cloud.com.au/how-to-guides/invisible-background-modal-view/

обновление

для совместимости с прошивкой 7 вам нужно добавить новый [self setModalPresentationStyle:UIModalPresentationCurrentContext]; - проверить весь код. Кроме того, вы должны установить animate : No (он работает с Да, но у вас будет сообщение в консоли :)

+0

Это не работает для меня (iOS8.1). Вы могли бы подумать, что это будет так просто, но контроллер представления все равно исчезает после завершения анимации. Я использую UIViewController, который не является корнем. Позвольте мне попробовать сделать это на корневом контроллере вместо этого ... – pfg2009

+0

Это полностью работает. Спасибо Спасибо спасибо! Я делал это не по порядку (так как все эти константы UIModelXYZ выглядят визуально похожими друг на друга). Однако, используя тот же порядок, который вы указали, этот трюк красиво. – pfg2009

+0

:) Рад узнать, что это сработало для вас. Счастливое кодирование :) – TonyMkenu

0

В подобной ситуации, что я сделал было:

Я добавил UIImageView в качестве фонового изображения моего модальных View Controller.

Затем я использовал UIImage + ImageEffectscategory, предоставленный apple, для создания размытого изображения моего родительского контроллера.

я реализовал метод в моем родительском классе, как:

// Returns the blurred image 
- (UIImage *)getBlurredImage 
{ 
    // You will want to calculate this in code based on the view you will be presenting. 
    CGSize size = self.view.frame.size; 

    UIGraphicsBeginImageContext(size); 

    // view is the view you are grabbing the screen shot of. The view that is to be blurred. 
    [self.view drawViewHierarchyInRect:(CGRect)self.view.bounds afterScreenUpdates:YES]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    // Gaussian Blur 
    image = [image applyDarkEffect]; 

    // Box Blur 
    // image = [image boxblurImageWithBlur:0.2f]; 

    return image; 
} 

Я прошел UIImage сгенерированные с помощью этого метода к моему модальному контроллеру представления и установить его в качестве фонового изображения (для представления изображения я добавил ранее) ,

+0

Да, это один из способов обработки вещей, спасибо. Мне любопытно, хотя я могу обойтись, не кэшируя ничего. – pfg2009

+0

Другими словами, я ищу менее жесткое решение. – pfg2009

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