mon application jusqu'à iOS 7 fonctionne correctement. Je l'ai essayé aujourd'hui avec Xcode 6 et quand je le lance, j'ai une mauvaise surprise :(:
Vous pouvez voir que Xcode dessine maintenant mon viewController comme s'il était en mode portrait mais, comme vous pouvez le voir, en mode paysage.
Savez-vous ce qui change dans iOS 8? :/ J'ai utilisé les méthodes d'orientation suivantes:
MODIFIER:
Je viens de découvrir cette méthode:
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
return UIInterfaceOrientationMaskLandscape;
}
Et maintenant, mes premiers viewcontrollers fonctionnent correctement :). le problème est quand je montre un modal (qui change l'ensemble de la méthode dans UIInterfaceOrientationMaskAll) refaire l'effet laid de screenshot Justement, je change mes méthodes dans ce mode:
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
if(self.restrictRotation)
{
return UIInterfaceOrientationMaskLandscape;
}
else
{
return UIInterfaceOrientationMaskAll;
}
}
// THIS IS A DELEGATE OF MODAL VIEW CONTROLLER
- (void)updateInterfaceAfterDocumentPreviewViewController
{
NSLog(@"updateInterfaceAfterDocumentPreviewViewController");
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft];
AppDelegate* appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
appDelegate.restrictRotation = YES;
}
S'il vous plaît essayez le code suivant
Dans la didFinishLaunchingWithOptions
de AppDelegate
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
[self.window setFrame:[[UIScreen mainScreen] bounds]]; //Add
Le problème semble être l’ordre des appels lorsque vous configurez la fenêtre. Vous devez appeler makeKeyAndVisible
avant d'affecter rootViewController
dans votre méthode didFinishLaunchingWithOptions
sur le délégué d'application. Les oeuvres suivantes:
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
[self.window makeKeyAndVisible];
self.window.rootViewController = self.myMainViewController;
Mais si vous modifiez l'ordre en:
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.rootViewController = self.myMainViewController;
[self.window makeKeyAndVisible];
Vous obtenez le comportement que vous rencontrez.
Consultez votre fichier .plist.
J'ai eu exactement le même problème avec un "écran de chargement". C'est ce qui a fonctionné pour moi. (Remarque: mon application ne prend en charge que iOS 7 ou version ultérieure, en mode paysage.):
CGRect theFrame = self.view.frame;
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0) {
CGRect screenBounds = [[UIScreen mainScreen] bounds];
theFrame.Origin = CGPointZero;
theFrame.size.width = screenBounds.size.height;
theFrame.size.height = screenBounds.size.width;
}
NSLog(@"%@", [NSNumber valueWithCGRect:theFrame]);
self.loadingScreen = [[UIView alloc] initWithFrame:theFrame];
Veuillez vous reporter à la réponse de Mike Hay si votre application prend en charge l'orientation portrait et pour connaître le "chemin à parcourir pour calculer le cadre d'application correct": https://stackoverflow.com/a/18072095/4108485
J'espère que cela t'aides.
J'avais un problème similaire, je ne pouvais pas montrer le bon lancer d'images à afficher (j'avais deux pour iPad, Default-Portrait.png et Default-Landscape.png) et je ne pouvais pas non plus que l'application elle-même s'oriente après que l'image de lancement a disparu.
Pour résoudre le problème des images de lancement:
Pour résoudre le problème d'orientation des applications dans un premier temps ViewController:
Solution Oldschool:
BOOL portrait;
BOOL iOS8OrLater = ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0);
if (iOS8OrLater) {
CGFloat height = CGRectGetHeight(self.view.frame);
CGFloat width = CGRectGetWidth(self.view.frame);
if (width / height > 1.0) {
portrait = NO;
} else {
portrait = YES;
}
} else {
portrait = UIInterfaceOrientationIsPortrait(self.interfaceOrientation);
}
if(portrait) {
[self layoutPortrait];
} else {
[self layoutLandscape];
}
Vous pouvez appeler cela dans viewWillLayoutSubviews
Cette approche de la détection de l'orientation était obsolète dans iOS8 (mais était toujours autorisée pour le moment). Il a été remplacé par le concept de classes de taille et Collections de caractères .
(Bizarrement, je n'arrive pas à trouver une référence de classe de taille dans la documentation d'Apple en ligne pour le moment - jurerais qu'elle l'était auparavant - peut-être en XCode). Voir ici pour les vidéos WWDC.
Quoi qu'il en soit, Interface Builder contient une case à cocher indiquant " Utiliser les classes de taille ." Peut-être avez-vous coché cette case. Éteignez-le et voyez si cela vous aide?
UIInterfaceOrientation currentOrientation = [UIApplication sharedApplication].statusBarOrientation;
if( UIDeviceOrientationIsLandscape( currentOrientation ) )
{
if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
{
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];
// -- Fix for rotation issue for ios 8
if( IS_IOS_8_OR_LATER )
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad"
bundle: nil];
// -- Set frame of nav controller
UINavigationController *nc = [storyboard instantiateViewControllerWithIdentifier:@"NavController"];
self.window.rootViewController = nc;
[self.window setFrame:[[UIScreen mainScreen] bounds]];
// -- Set fame of home view controller
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"Home"];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
[self.window setFrame:[[UIScreen mainScreen] bounds]];
}
}
}