开发者

Present modal ViewController from SubView

开发者 https://www.devze.com 2023-03-15 01:25 出处:网络
I am trying to present a modal view controller C from view controller B. B\'s view does not cover the full screen, and is a subview of another view controller, A. What I am seeing when I try to presen

I am trying to present a modal view controller C from view controller B. B's view does not cover the full screen, and is a subview of another view controller, A. What I am seeing when I try to present a fullscreen modal is the modal is covering the full screen, but when I tap on certain places in the screen the control will get 'passed through' to A's view.

I can bypass this by presenting the modal from A via some kind of delegation, but I have no idea why this is happening! Aft开发者_StackOverflow中文版er all, if you have a tab bar controller managing one of your views, and you try to present a modal view, it covers the full screen just fine. Is there some magic going on behind the scenes?


I don't think there is any official documentation on how the modal is implemented, but any view can get the UIWindow of the UIApplication and call -presentModal... on the rootViewController property. This will have the affect of making your modal full screen. I'm sure there are other ways of achieving the same effect though.

[[[[UIApplication sharedApplication] keyWindow] rootViewController] presentModalViewController:myModalVC animated:YES];

In that scenario, you need to implement your own 'modal' methods for all your view controllers, using addSubview: and bringSubviewToFront:. I've done this in one of my larger project where I wanted some different behavior from the modal views.


This worked for me:

UIViewController* vc = [[[UIViewController alloc] init] autorelease];
UIWindow* keyWindow = [[UIApplication sharedApplication] keyWindow];
UIView* topView = [[keyWindow subviews] objectAtIndex:[[keyWindow subviews] count] - 1];
vc.view = topView;

[vc presentModelViewController...

Basically, you create a new UIViewController and attach it to the topmost view on the main window (which is the view the user currently sees).


Simple, but not sure about acceptance and efficiency. This is what I use.

  1. Embed all the view controllers in a mainView below the rootView.
  2. Add any modal views to the rootView while disabling userInteractionEnabled flag for the mainView. The modal view should be added to rootView and not mainView
  3. Once done, re-enable the user interaction for mainView.

Hope this helps...

0

精彩评论

暂无评论...
验证码 换一张
取 消