J'ai une application avec 9-10 écrans. J'ai incorporé une UINavigationController
dans mon contrôleur de vue. Je n'ai que quelques contrôleurs de vue pour lesquels je souhaite définir uniquement l'orientation portrait: cela signifie que la rotation de l'appareil ne doit pas faire pivoter ces contrôleurs de vue en mode paysage. J'ai essayé les solutions suivantes:
premier:
NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];
mais l'écran tourne toujours en paysage.
Deuxièmement: J'ai créé une classe de contrôleur de vue personnalisée en tant que PortraitViewController
et ajouté le code ci-dessous dans PortraitViewController.m
@interface PortraitViewController ()
@end
@implementation PortraitViewController
- (BOOL)shouldAutorotate
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations
{
//Here check class name and then return type of orientation
return UIInterfaceOrientationMaskPortrait;
}
@end
Après cela, j'ai implémenté PortraitViewController.h
en tant que classe de base
#import <UIKit/UIKit.h>
#import "PortraitViewController.h"
@interface Login : PortraitViewController
@end
Cela ne fonctionne pas du tout, permet toujours au contrôleur de vue de pivoter en mode paysage.
Existe-t-il une autre solution que j'utilise iOS 8 et ne souhaite pas que viewcontroller tourne en mode paysage?
EDIT: Est-il possible d'avoir une orientation Paysage uniquement pour certains contrôleurs de vue et d'obliger celle-ci à rester en mode Portrait?
Essayez de sous-classer la UINavigationController
que vous utilisez car la valeur par défaut UINavigationController
ne transfère pas la méthode shouldAutorotate
à votre viewcontroller.
Implémentez la méthode suivante dans votre sous-classe UINavigationController
- (BOOL)shouldAutorotate
{
return [self.visibleViewController shouldAutorotate];
}
Maintenant, la UINavigationController
transfère l'appel de méthode à sa UIViewController
visible actuelle. Vous devez donc implémenter shouldAutorotate
individuellement pour obtenir l'effet souhaité.
Essayez d'ajouter cette méthode avec shouldAutorotate
et supportedInterfaceOrientations
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
//Setting the orientation of the view. I've set it to portrait here.
return UIInterfaceOrientationPortrait;
}
Vous pouvez aussi utiliser ce [UIViewController attemptRotationToDeviceOrientation]
pour qu’il tourne dans la nouvelle orientation souhaitée.
Votre PortraitViewController va bien et je ne connais pas votre configuration Storyboard. Dans votre cas, l’important est d’incorporer votre contrôleur de vue cible dans un autre nouveau contrôleur de navigation, puis de définir sa classe sur votre PortraitViewController et de présenter cette navigation de manière modale, comme je l’ai fait dans l’image ci-dessous et tout fonctionne comme prévu.
Ci-dessous se trouve la sous-classe Mine PortrateNavigation de UINavigationController.
PortrateNavigation.h
#import <UIKit/UIKit.h>
@interface PortrateNavigation : UINavigationController
@end
PortrateNavigation.m
#import "PortrateNavigation.h"
@implementation PortrateNavigation
- (void)viewDidLoad {
[super viewDidLoad];
}
- (BOOL)shouldAutorotate {
return YES;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
@end
Créez une catégorie sur la UINavigationController
et remplacez supportedInterfaceOrientations
#import "UINavigationController+Orientation.h"
@implementation UINavigationController (Orientation)
-(NSUInteger)supportedInterfaceOrientations
{
return [self.topViewController supportedInterfaceOrientations];
}
-(BOOL)shouldAutorotate
{
return YES;
}
@end
Lorsque vous avez incorporé UINavigationController
, les conteneurs ne demandent pas à leurs enfants de faire une rotation ou non
Tu dois le faire manuellement. Tous les contrôleurs de vue, dans ceux pour lesquels vous ne souhaitez pas faire pivoter la vue, implémentent la méthode suivante.
- (BOOL)shouldAutorotate
{
return NO;
}
1) Créez une variable bool dans votre AppDelegate.
2) Puis copiez et collez le code ci-dessous dans AppDelegate.m (modifiez-le selon vos besoins)
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{NSLog(@"%d", [UIDevice currentDevice].orientation)
if (self.isLandscape == YES) //bool created in first step
{
return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}
return UIInterfaceOrientationMaskPortrait;
}
3) Maintenant, copiez et collez le code ci-dessous dans la méthode viewWillAppear du contrôleur de vue pour lequel vous souhaitez forcer l'orientation.
[AppDelegate sharedAppDelegate].isLandscape = YES; //bool created in first step
NSNumber *value1 = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight]; //change the orientation as per your requirement
[[UIDevice currentDevice] setValue:value1 forKey:@"orientation"];
4) Maintenant, avant d’appuyer sur ce contrôleur de vue, vous devez d’abord régler le booléen. Alors, disons que vous voulez pousser le contrôleur de vue ABC
[AppDelegate sharedAppDelegate].isLandscape = YES;
[self.navigationController pushViewController:<ABC view controller instance> animated:NO];
J'espère que cela t'aides!!
Tr ceci dans votre contrôleur de vue
- (BOOL)shouldAutorotate{
return NO;
}
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationPortrait |
UIInterfaceOrientationPortraitUpsideDown;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
return UIInterfaceOrientationPortrait;
}
class ViewController: UIViewController {
override func shouldAutorotate() -> Bool {
return false
}
}
Voici le lien vers le sujet: http://koreyhinton.com/blog/lock-screen-rotation-in-ios8.html
Si vous souhaitez désactiver temporairement la rotation automatique, évitez de manipuler les masques d'orientation à cette fin. À la place, substituez la méthode shouldAutorotate sur le contrôleur de vue initial. Cette méthode est appelée avant d’effectuer une autorotation. Si la réponse est NON, la rotation est supprimée.
Donc, vous devez sous-classe 'UINavigationController', implémenter devrait Autoriser et utiliser votre classe de contrôleur de navigation dans votre storyboard.
- (BOOL)shouldAutorotate
{
id currentViewController = self.topViewController;
if ([currentViewController isKindOfClass:[DetailViewController class]])
return NO;
return YES;
}
une autre approche peut être trouvée sur
http://www.sebastianborggrewe.de/only-make-one-single-view-controller-rotate/