gpt4 book ai didi

iOS - 不同 View Controller 的不同屏幕方向

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:17:55 24 4
gpt4 key购买 nike

我知道这个问题已经在这里被询问和讨论了很多,但过去几天我一直在互联网上搜索不同的解决方案,但无论我尝试什么 - 似乎都没有效果。

编辑:试过this solution同样,仍然没有运气......

我有一个 iOS7 应用程序(我目前不关心对 iOS6 的支持,但它会很好)有一个 Root View Controller 和一个从侧面滑动的菜单( this one ,是具体)并允许您在不同的屏幕之间切换。选定的屏幕被加载到导航 Controller 中,并且在导航 Controller 和屏幕的 View Controller 之间存在“模态”类型的连接(首先出现的屏幕除外,它与 Root View Controller 有关系)。我也用“push”segues 尝试过这个,结果相同。其中一个屏幕只能以横向模式显示,其他屏幕只能以纵向模式显示。

为此,在我的 Root View Controller 中,我实现了以下内容:

- (void)awakeFromNib
{
self.contentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"contentController"];
self.menuViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"menuController"];
}

-(NSUInteger)supportedInterfaceOrientations
{
if (self.contentViewController)
return [self.contentViewController supportedInterfaceOrientations];

return UIInterfaceOrientationMaskPortrait;
}

-(BOOL)shouldAutorotate
{
return YES;
}

在我的导航 View Controller 中,我实现了以下内容:

-(BOOL)shouldAutorotate
{
return YES;
}
-(NSUInteger)supportedInterfaceOrientations
{
return [self.topViewController supportedInterfaceOrientations];
}
-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return [self.topViewController preferredInterfaceOrientationForPresentation];
}

在我实现的每个纵向屏幕的 View Controller 中:

-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationPortrait;
}

在横向屏幕中:

- (NSUInteger) supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscape;
}
-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationLandscapeLeft;
}

应用程序的第一个屏幕是纵向屏幕。所以发生的事情是,应用程序以纵向模式加载并且不会旋转到任何其他方向(这很好)。但!一旦我加载横向屏幕,它就会以纵向模式加载,只有当我将设备旋转到横向模式时,它才会旋转并锁定为横向模式。一旦我切换回纵向屏幕,它就会以横向模式加载,只有当我将设备旋转到纵向时,它才会旋转并锁定为纵向模式,并且由于某种原因使屏幕非常窄......

我所获得的最接近体面的解决方案是在横向屏幕的 View Controller 中实现它:

-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];

CGRect screenRect = [[UIScreen mainScreen] bounds];
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft];
CGAffineTransform landscapeTransform = CGAffineTransformMakeRotation(degreesToRadian(270));
landscapeTransform = CGAffineTransformTranslate(landscapeTransform, 0.0, 0.0);
[self.navigationController.view setTransform:landscapeTransform];
self.navigationController.view.bounds = CGRectMake(0.0, 0.0, screenRect.size.height, screenRect.size.width);
}

-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];

CGRect screenRect = [[UIScreen mainScreen] bounds];
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];
CGAffineTransform landscapeTransform = CGAffineTransformMakeRotation(degreesToRadian(0));
landscapeTransform = CGAffineTransformTranslate(landscapeTransform, 0.0, 0.0);
[self.navigationController.view setTransform:landscapeTransform];
self.navigationController.view.bounds = CGRectMake(0.0, 0.0, screenRect.size.width, screenRect.size.height);
}
#define degreesToRadian(x) (M_PI * (x)/180.0)

并将此 View Controller 的支持和首选方向更改为纵向。这基本上使整个应用程序锁定在纵向模式。虽然它看起来不错,但似乎有点粗略,我更愿意有一个“干净”的解决方案,并支持左右横向。关于我在这里缺少什么的任何想法?

如果您需要我提供更多代码,请告诉我。谢谢!! :)

最佳答案

好的,以防万一有人对此感兴趣,这是我的解决方案,使用公认的答案 here :

我缺少的是我的方法 - 风景 VC 不能与肖像 VC 在同一个根 VC 下,它需要是或有自己的根 VC,在风景中。

所以首先,我将景观 VC 与 Storyboard 中的其余部分分开,现在它完全独立了。接下来,我创建了一个“view controller switch”方法,它基本上加载了一个新的 Controller ,将其设置为根 Controller ,并释放了之前的根 Controller :

+(void)loadController:(UIViewController *)VControllerToLoad andRelease:(UIViewController *)VControllerToRelease
{
//adjust the frame of the new controller
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;
//set the new controller as the root controller
[[[UIApplication sharedApplication].delegate window] setRootViewController:VControllerToLoad];
//kill the previous view controller
[VControllerToRelease.view removeFromSuperview];
}

在景观 VC 中,我添加了这段代码:

-(BOOL)shouldAutorotate
{
return YES;
}

而每当我需要呈现风景VC或返回肖像VC时,我只是使用VC切换方法。例如:

[AppUtils loadController:landscapeViewController andRelease:portraitNavigationController];

就是这样!现在一切都像一个魅力! :)

关于iOS - 不同 View Controller 的不同屏幕方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24596983/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com