0

我的应用程序是基于导航的,主要以纵向运行,但一个视图控制器同时支持纵向和横向。现在的问题是,当我从横向视图控制器推送新视图控制器时,新视图控制器也会以横向模式推送,尽管我希望它处于纵向模式。

此外,当我从横向控制器弹出视图控制器时,弹出的视图控制器将以纵向模式显示。

我不知道我的代码有什么问题。

这是用于这些方向支持的我的代码片段和信息。

在 info.plist 文件中,我保持对所有方向的支持,但纵向倒置。

我还为导航控制器类别添加了类别,如下所示。

@implementation UINavigationController(Rotation_IOS6)
-(BOOL)shouldAutorotate
{
    return [[self.viewControllers lastObject] shouldAutorotate];
}

-(NSUInteger)supportedInterfaceOrientations
{
    return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}
@end

我还创建了一个 UIViewController 子类,它充当所有类的超类。以下是超类的定向方法。

@implementation ParentViewController

- (BOOL)shouldAutorotate{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait;
}

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
    return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
    return UIInterfaceOrientationPortrait;
}
@end

支持横向的方向方法控制器如下。

@implementation LandscapeController
#pragma mark -
#pragma mark Orientation Methods
- (BOOL)shouldAutorotate{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait|UIInterfaceOrientationMaskLandscape;
}

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
    return (toInterfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
@end

提前致谢。

4

2 回答 2

0

这是推送视图的方法。进行对象切换

在 switch.m

+ (void)loadController:(UIViewController*)VControllerToLoad andRelease:(UIViewController*)VControllerToRelease
{

VControllerToLoad.navigationController.navigationBar.frame=CGRectMake(0, 0, 568, 44);
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
CGRect windowFrame = [[UIScreen mainScreen] bounds];
CGRect firstViewFrame = CGRectMake(statusBarFrame.origin.x, statusBarFrame.size.height, windowFrame.size.width, windowFrame.size.height - statusBarFrame.size.height);
VControllerToLoad.view.frame = firstViewFrame;

//check version and go

if (IOS_OLDER_THAN_6)
{
    [((AppDelegate*)[UIApplication sharedApplication].delegate).window addSubview:VControllerToLoad.view];
}
else
{
    [((AppDelegate*)[UIApplication sharedApplication].delegate).window setRootViewController:VControllerToLoad];

}
  [VControllerToRelease.view removeFromSuperview];
}

您可以使用上述方法从横向模式推送到纵向视图

 PortraitViewController *portraitVC=[[PortraitViewController alloc]initWithNibName:@"PortraitViewController" bundle:nil];

  [Switch loadController:portraitVC andRelease:self];

在横向视图控制器.m

    - (void)viewDidLoad
{
    [super viewDidLoad];
    self.navigationController.title=@"Landscape";
    appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    appDelegate.navigationController.navigationBarHidden = NO;
    if (IOS_OLDER_THAN_6)
        [[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:NO];
    // Do any additional setup after loading the view from its nib.
}

#ifdef IOS_NEWER_OR_EQUAL_TO_6

-(BOOL)shouldAutorotate  
{
    return YES; 
 }

- (NSUInteger)supportedInterfaceOrientations    
 {
    return UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskLandscapeLeft; 
 }

#endif
于 2013-02-15T14:45:12.303 回答
0

我有一个类似的问题。在我的情况下,这个视图控制器必须始终以横向显示,并且在返回的路上其他视图控制器必须设置回纵向。

我在 FAQ 中找到了以下解决方案: iPhone Landscape FAQ and Solutions

该想法的关键在于,只能通过一种方式强制设备进入某个方向: 1. 设置状态栏的方向。2. 以模态方式(!)呈现任何支持目标方向的视图控制器。

好吧,您不想以模态方式呈现任何东西吗?不用担心。没有什么能阻止你...... 3. 一旦出现,立即关闭该视图控制器。当您这样做时,用户甚至不会看到它。但是一旦完成,您的设备就会保持这个方向。4. 推送您想要显示的视图控制器,甚至在您使用情节提要的情况下继续使用它。

对我来说,这似乎是唯一可行的解​​决方案。除了常见问题解答中的答案之外,其他所有内容也必须正确设置。整个项目支持的设备方向必须基本全部。每个视图控制器支持的方向必须是每个视图控制器支持并shouldAutoRotate应该返回的方向YES。如果涉及标签栏控制器,则会变得更加困难。如果您的应用基于标签栏,请回复我。

于 2013-02-15T15:07:49.713 回答