Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Popover with ModalPresentationStyle is not centered in iOS 7 iPad

Tags:

I have a problem with iOS 7 that seems to be a bug or I just don't do something right. I have modalViewController that appears as a popover on iPad with ModalPresentationStyle. And it is not standard size, custom sized. Here is the code:

myViewController *myVC = [[myViewController alloc] init]; UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:myVC]; [nav setModalPresentationStyle:UIModalPresentationFormSheet]; [nav setModalTransitionStyle: UIModalTransitionStyleFlipHorizontal]; [self presentViewController:nav animated:YES completion:nil]; nav.view.superview.bounds = CGRectMake(0, 0, 320, 465); 

It's all working fine in iOS 6, but in iOS 7 it's not centered. But if I set ModalTransitionStyle to UIModalTransitionStyleCrossDissolve it works fine. But only in this mode. Maybe someone stumbled on this one too and know how to fix it? I'm not a big fan of dissolve effect. Thank you.

like image 434
titicaca Avatar asked Sep 22 '13 04:09

titicaca


2 Answers

I had the same problem. I have solved this by using another approach, found here.

What this solution proposes is to use the method (void)viewWillLayoutSubviews

So in case of @Manuel M. inside the GeneralSettingsViewController add the code below:

// GeneralSettingsViewController - (void)viewWillLayoutSubviews{     [super viewWillLayoutSubviews];     self.view.superview.bounds = CGRectMake(0, 0, 497, 375); } 

And you won't need this code anymore:

self.generalSettingsVC.view.superview.frame = CGRectMake(0, 0, 497, 375); self.generalSettingsVC.view.superview.center = self.view.center; 

For @titicaca, you are using a UINavigationController I haven't test it with this Controller but you could try the same solution I mentioned, extending the UINavigationController and overwrite the viewWillLayoutSubviews method.

[EDIT]

For @titicaca I tried it in a new project and for me it worked. What I did was having a custom navigation view controller CustomNavigationController overriding the viewWillLayoutSubviewslike this:

- (void)viewWillLayoutSubviews{     [super viewWillLayoutSubviews];     self.view.superview.bounds = CGRectMake(0, 0, 330, 284); } 

Then, the view controller that presents the CustomNavigationController should execute a code similar to this:

UIViewController *myVC = [[UIViewController alloc] init]; [myVC.view setBackgroundColor:[UIColor redColor]];  CustomNavigationController *nav = [[CustomNavigationController alloc] initWithRootViewController:myVC]; [nav setModalPresentationStyle:UIModalPresentationFormSheet]; [nav setModalTransitionStyle: UIModalTransitionStyleFlipHorizontal];  [self presentViewController:nav animated:YES completion:nil]; 

You need to make sure though, that the dimensions of the self.view.superview.bounds = CGRectMake(0, 0, 330, 284); are even numbers otherwise the text inside gets fuzzy, if there is any

like image 189
Tamara Bernad Avatar answered Nov 14 '22 04:11

Tamara Bernad


For me the issue was calling becomeFirstResponder on a text field in the viewDidAppear of the presented view controller. Appears to be a bug with that now. The solution was wrapping it in a simple dispatch_async:

- (void)viewDidAppear:(BOOL)animated {     [super viewDidAppear:animated];     dispatch_async(dispatch_get_main_queue(), ^{         [self.userNameTextField becomeFirstResponder];     }); } 
like image 41
Bob Spryn Avatar answered Nov 14 '22 04:11

Bob Spryn