iPhone UIViewController va sous la barre d'état

J'ai une vue UIView et une vue UIController . Mon est standard une vue 320×460. Dans l' applicationDidFinishLaunching je fais:

 [window addSubview:[controller view]]; 

La chose étrange est que l' UIView passe sous la barre d'état (comme s'il y avait une sortie manquante). Cependant, si je fais pivoter l'iPhone sur le côté puis à l'arrière, ça se voit bien.

Est-ce un comportement attendu (je parie que je peux le corriger en réglant le décalage) ou est-ce que je fais mal?

Je pense que votre problème est que lorsque vous ajoutez une vue à une window, vous devez connaître l'état de la barre d'état et la compenser:

 if showing the status bar : [controller view].frame = CGRectMake(0, **20**, 320, 460); else [controller view].frame = CGRectMake(0, 0, 320, **480**); 

C'est pourquoi IB vous montre une barre d'état fictive.

J'ai rencontré ce problème lors de l'affichage d'un UIViewController via presentModalViewController.

Vous pouvez contourner le problème en redimensionnant manuellement la vue du controller après l'apparition de la vue:

 - (void) viewDidAppear: (BOOL) animated { //manually adjust the frame of the main view to prevent it from appearing under the status bar. UIApplication *app = [UIApplication sharedApplication]; if(!app.statusBarHidden) { [self.view setFrame:CGRectMake(0.0,app.statusBarFrame.size.height, self.view.bounds.size.width, self.view.bounds.size.height - app.statusBarFrame.size.height)]; } } 

J'ajoute ce numéro aujourd'hui. Il s'est avéré que j'avais "Wants Full Screen" vérifié dans l'inspecteur d'attributes du ViewController.

La désactivation de "Wants Full Screen" a résolu le problème.

Finalement, je suis arrivé à cette solution. Fonctionne bien pour iPhone et iPad :

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Allocate view controller and load nib file if (isIPhone) { self.mainViewController = [[[tfdMainViewController_iPhone alloc] initWithNibName:@"tfdMainViewController_iPhone" bundle:nil] autorelease]; } else { self.mainViewController = [[[tfdMainViewController_iPad alloc] initWithNibName:@"tfdMainViewController_iPad" bundle:nil] autorelease]; } // Offset correction (iPhone bug?) CGRect r = self.mainViewController.view.frame; r = CGRectOffset(r, 0, [UIApplication sharedApplication].statusBarFrame.size.height); [self.mainViewController.view setFrame:r]; [window addSubview: self.mainViewController.view]; [self.window makeKeyAndVisible]; return YES; } 

PS Pour une raison quelconque, l'affichage a une hauteur correcte: 480 (hauteur de l'écran en mode Portrait de l'iPhone) – 20 (barre d'état) = 460, mais n'a pas réussi à définir le décalage vertical. C'est un comportement assez étrange, qui ressemble à un bug.

Corrections à la window ne fonctionnait pas pour moi car j'avais une vue modale. Une vue modale UIModalPresentationCurrentContext. OK, voici ce qui a fonctionné pour moi. J'ai cherché sur le web avant de commencer à travailler. Je suis incapable de déplacer le view.frame du parent. Cependant, dans viewWillAppear, je peux le déplacer:

 - (void)viewWillAppear:(BOOL)animated { // Move down to compensate for statusbar CGRect frame = parentView.navCon.view.frame; frame.origin.y = [UIApplication sharedApplication].statusBarFrame.size.height; parentView.navCon.view.frame = frame; } 

Si vous utilisez les "Simulated User Interface Elements" d'Interface Builder, vous devez également vous assurer que vous avez défini l'indicateur "Resize View From NIB" dans votre plume MainWindow.

Cela semble être un bug dans iOS 5. Une solution serait d'utiliser wantsFullScreenLayout dans n'importe quelle vue que le controller a besoin de présenter de façon modale et manuellement la vue toujours en dessous de la barre d'état.

http://www.cocoanetics.com/2012/06/radar-view-frame-inconsistency-using-presentviewcontroller-wantsfullscreenlayout-yn/

http://openradar.appspot.com/radar?id=1758406

Définissez-vous manuellement la propriété cachée de la barre d'application APRÈS avoir ajouté la sous-vue? Je ne m'imagine pas que ce soit le cas, mais s'il est réglé sur none lorsque vous chargez la vue, il sera mis en page comme s'il n'y en avait pas, et si vous définissez la barre d'état non masquée, elle s'affichera de votre sharepoint vue.

Une solution possible consiste à utiliser [[controller view] setNeedsLayout]; après avoir ajouté la sous-vue, ou éventuellement [window layoutSubviews]; . Je n'ai jamais eu beaucoup de succès en utilisant ceux-ci pour corriger les problèmes de layout, mais comme cela fonctionne après une rotation, ça vaut le coup.

Même moi aussi j'ai eu le même problème. Lorsque nous utilisons un certain encoding pour l'orientation de l'appareil, nous avons écrit un code dans le délégué de l'application ou dans notre controller de vue. Là, nous devons changer la condition pour utiliser le return d'orientation OUI ou NON. Cela a résolu notre problème.

Je préfère utiliser UINavigationController pour envelopper le UIViewController vous, après cela, définissez le NavigationBarHidden à UINavigationController. C'est la solution parfaite car UINavigationController gère la hauteur de la barre d'état dans iOS 7.

Voici mon code et ma capture d'écran.

 UINavigationController *wrapNavController = [[UINavigationController alloc] initWithRootViewController:yourViewController] ; [wrapNavController setNavigationBarHidden:YES] ; 

La solution Xcode 6, iOS7 / 8 permet de décocher la case "Barres sous les barres" dans la section "Extension des bords" de la section View Controller de l'inspecteur d'attributes.

Pour Xamarin.iOS ce serait:

 if (UIApplication.SharedApplication.StatusBarHidden == false) { var statusBarHeight = UIApplication.SharedApplication.StatusBarFrame.Height; View.Frame = new CoreGraphics.CGRect(0, statusBarHeight, View.Frame.Width, View.Frame.Height - statusBarHeight); }