我有2个视图控制器。我希望第一个viewcontroller只是Portrait模式,而第二个viewController应该支持所有方向。请帮帮我。
在AppDelegate类中,我的代码是:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];
UINavigationController * navController = [[UINavigationController alloc] initWithRootViewController:self.viewController];
self.window.rootViewController = self.viewController;
// [self.window addSubview:navController.view];
[self.window makeKeyAndVisible];
return YES;
}
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
NSLog(@"supportedInterfaceOrientationsForWindow");
return UIInterfaceOrientationMaskAllButUpsideDown;
}
第一个ViewController代码是:
-(BOOL)shouldAutorotate
{
return NO;
}
-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
// Tell the system which initial orientation we want to have
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return UIInterfaceOrientationMaskPortrait;
}
第二个ViewController代码是:
-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskAllButUpsideDown;
}
-(BOOL)shouldAutorotate
{
return YES;
}
// Tell the system which initial orientation we want to have
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return UIInterfaceOrientationMaskAllButUpsideDown;
}
我检查的是'shouldAutorotate'方法没有被调用第一和第二ViewController。
您的快速帮助将非常值得注意。 谢谢。 卡希夫
答案 0 :(得分:8)
尝试为第二个UIViewController设置supportedInterfaceOrientations,如下所示:
- (BOOL) shouldAutorotate
{
return YES;
}
-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscapeRight; // add any other you want
}
此外,在第一个UIViewController中仅使用相同方法启用肖像。
也许您需要在第二个UIViewController需要支持的项目设置中启用这些方向。
[编辑#1:添加了示例应用程序]
在这里,您可以使用示例应用程序解决您的问题。
<强> AppDelegate.h 强>
#import <UIKit/UIKit.h>
@class FirstViewController;
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) FirstViewController *viewController;
@end
<强> AppDelegate.m 强>
#import "AppDelegate.h"
#import "FirstViewController.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.viewController = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application
{
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
// Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
- (void)applicationWillTerminate:(UIApplication *)application
{
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
@end
<强> FirstViewController.h 强>
#import <UIKit/UIKit.h>
@interface FirstViewController : UIViewController
- (IBAction)goToSecondViewController:(id)sender;
@end
<强> FirstViewController.m 强>
#import "FirstViewController.h"
#import "SecondViewController.h"
@interface FirstViewController ()
@end
@implementation FirstViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self)
{
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
-(BOOL)shouldAutorotate
{
return NO;
}
-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskAll;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationMaskPortrait;
}
- (IBAction)goToSecondViewController:(id)sender
{
SecondViewController *svc = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
[self presentViewController:svc animated:NO completion:nil];
}
@end
<强> SecondViewController.h 强>
#import <UIKit/UIKit.h>
@interface SecondViewController : UIViewController
- (IBAction)goToFirstViewController:(id)sender;
@end
<强> SecondViewController.m 强>
#import "SecondViewController.h"
@interface SecondViewController ()
@end
@implementation SecondViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self)
{
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskAll;
}
-(BOOL)shouldAutorotate
{
return YES;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationLandscapeLeft;
}
- (IBAction)goToFirstViewController:(id)sender
{
[self dismissViewControllerAnimated:NO completion:nil];
}
@end
<强> FirstViewController.xib 强>
<强> SecondViewController.xib 强>
答案 1 :(得分:2)
根据您的描述,第一个视图控制器被推入导航控制器。您对shouldAutorotate
和supportedInterfaceOrientations
的方法定义绝对正确。在方向更改期间,导航控制器的shouldRotate仅触发,并且不会触发您的第一个视图控制器(导航控制器的子节点)shouldAutorotate。因此,您必须在视图控制器中的category
navigationController或单独的文件中导入并在需要的地方导入。 UINavigation Controller类别的代码如下。
.h文件有此代码
@interface UINavigationController (autoRotate)
-(BOOL)shouldAutorotate;
- (NSUInteger)supportedInterfaceOrientations;
@end
.m文件有此代码
#import "UINavigationController+autoRotate.h"
@implementation UINavigationController (autoRotate)
-(BOOL)shouldAutorotate
{
return [[self.viewControllers lastObject] shouldAutorotate];
}
-(NSUInteger)supportedInterfaceOrientations
{
return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}
如果您在单独的文件中编写类别,则必须在第一个和第二个视图控制器中导入.h文件#import "UINavigationController+autoRotate"
答案 2 :(得分:0)
一个简单的解决方案:
实施:- (NSUInteger)supportedInterfaceOrientations
从AppDelegate.m询问时
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
有关详细信息,请点击此处: iOS 6 landscape and portrait orientation