IOS 6力装置方向为横向(IOS 6 force device orientation to la

2019-06-18 09:26发布

我给了一个应用程序与说10个视图控制器。 我使用导航控制器加载/卸载它们。

所有,但一个在纵向模式。 假设7 VC是在景观。 我需要它的风景,当它被载入呈现。

请提出一个方法来强制从纵向方向转到景观在iOS 6中 (这将是很好的IOS 5的工作以及)。

这里是我在做之前 ,IOS 6:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    UIViewController *c = [[[UIViewController alloc]init] autorelease];
    [self presentModalViewController:c animated:NO];
    [self dismissModalViewControllerAnimated:NO];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

展示和解雇模态VC是迫使应用程序来审查其走向,所以shouldAutorotateToInterfaceOrientation渐渐调用。

我已经试图在iOS 6中:

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

在负载时,控制器保持停留在画像。 旋转设备后,方位的变化只是确定。 但我需要使控制器自动旋转到负载景观,因此用户将不得不旋转设备能够正确看到的数据。

另一个问题:该装置旋转回纵向后,方向变为纵向,虽然我在指定supportedInterfaceOrientationsUIInterfaceOrientationMaskLandscape 。 为什么会发生?

另外,以上3种方法都不是获取调用。

一些(有用)数据:

  1. 在我的plist文件我已经指定了3个取向 - 但所有的倒挂。
  2. 该项目在Xcode 4.3 IOS 5开始前的Xcode 4.5 IOS 6,现在我用的是最新版本的所有类别,包括xibs创建。
  3. 在plist文件的状态栏设置为可见。
  4. 在厦门国际银行文件(一个我想在景观)状态栏是“无”,将方向设置为横向。

任何帮助表示赞赏。 谢谢。

Answer 1:

好吧,伙计们,我会后我的解决方案。

是)我有的:

  1. 视图基础的应用,有几个视图控制器。 (这是基础的导航,但我不得不让它查看基于,由于定位的问题)。
  2. 所有视图控制器是肖像,除了一个 - landscapeLeft。

任务:

  1. 我的一个观点控制器必须自动旋转为横向,不管用户如何持有该设备。 所有其他的控制器必须肖像,并留下山水控制器后,应用程序必须强制旋转为纵向,不管了,再次,用户如何持有该设备。
  2. 这必须作为6.x的IOS工作作为IOS 5.x的

走!

更新中删除由@IvanVučica建议宏)

在所有的纵向视图控制器覆盖自转的方法是这样的:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
    return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}
-(BOOL)shouldAutorotate {
    return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

你可以看到2种方法:一个是IOS 5,另一个是IOS 6。

同样为您的横向视图控制器,添加了一些新变化:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
    [image_signature setImage:[self resizeImage:image_signature.image]];
    return (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft);
}
-(BOOL)shouldAutorotate {
    return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
    [image_signature setImage:[self resizeImage:image_signature.image]];
    return UIInterfaceOrientationMaskLandscapeLeft;
}

注意 :强制自转在iOS 5中,你应该补充一点:

- (void)viewDidLoad{
    [super viewDidLoad];
    if ([[[UIDevice currentDevice] systemVersion] floatValue] < 6.0)
        [[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:NO];    
}

如此类推,你离开山水控制器后,您加载任何控制器,你应该再强制自转的iOS 5,但现在你会使用UIDeviceOrientationPortrait ,因为你去的肖像控制器:

- (void)viewDidLoad{
        [super viewDidLoad];
        if ([[[UIDevice currentDevice] systemVersion] floatValue] < 6.0)
            [[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationPortrait animated:NO];    
    }

现在,过去的事情(这是一个有点怪) -你必须改变你从一个控制器切换到另一个的方式,根据不同的IOS:

做一个NSObject类“Schalter”(德国“开关”)。

在Schalter.h说:

#import <Foundation/Foundation.h>

@interface Schalter : NSObject
+ (void)loadController:(UIViewController*)VControllerToLoad andRelease:(UIViewController*)VControllerToRelease;
@end

在Schalter.m说:

#import "Schalter.h"
#import "AppDelegate.h"

@implementation Schalter
+ (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;

    //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];

    //kill the previous view controller
    [VControllerToRelease.view removeFromSuperview];
}
@end

现在,这是你使用Schalter(假设你从仓管员到产品控制器)方式:

#import "Warehouse.h"
#import "Products.h"

@implementation Warehouse
Products *instance_to_products;

- (void)goToProducts{
    instance_to_products = [[Products alloc] init];
    [Schalter loadController:instance_to_products andRelease:self];
}

bla-bla-bla your methods

@end

当然,你必须释放instance_to_products对象:

- (void)dealloc{
     [instance_to_products release];
     [super dealloc];
}

那么,这是它。 不要犹豫,downvote,我不在乎。 这是谁正在寻找解决方案,而不是名声的人。 干杯! 萨瓦Mazare。



Answer 2:

这应该工作,它类似于前期的iOS 6版本,但有一个UINavigationController

UIViewController *portraitViewController = [[UIViewController alloc] init];
UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:portraitViewController];
[self.navigationController presentModalViewController:nc animated:NO];
[self.navigationController dismissModalViewControllerAnimated:NO];

我打电话这个我推下一个之前UIViewController 。 这将迫使下一推UIViewController显示在人像模式中,即使当前UIViewController是景观(应为纵向到横向工作太)。 适用于iOS 4 + 5 + 6我。



Answer 3:

我认为,最好的解决办法就是坚持苹果官方的文档。 所以,根据我使用下面的方法,一切都进行得很好在iOS 5和6我VC我重写以下方法:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return UIInterfaceOrientationIsPortrait(interfaceOrientation);
}

适用于iOS 6,所支持的第一种方法返回的方向面膜方法(其名称中标明)

-(NSUInteger)supportedInterfaceOrientations{

    return UIInterfaceOrientationMaskPortrait;
}

第二个这就是告诉你VC这是首选接口方向时,VC将被显示出来。

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationPortrait;
}

只需更改您要为纵向方向;)这种解决方案是工作顺利,我不喜欢创建宏和其他的东西的想法,去解决这个简单的解决方案。 希望这有助于...



Answer 4:

我有同样的问题,在我的应用程序27次从26日在纵向和唯一一个在所有方向(一个图像浏览器:))。 添加在每类中的宏和更换导航不是一个解决方案,我很舒服......

所以,我想保持UINavigationController的力学我的应用程序,而不是与其他代码替换此。

该怎么办:

@ 1在方法didFinishLaunchingWithOptions应用程序委托

if ([[UIDevice currentDevice].systemVersion floatValue] < 6.0)
{
    // how the view was configured before IOS6
    [self.window addSubview: navigationController.view];
    [self.window makeKeyAndVisible];
}
else
{
    // this is the code that will start the interface to rotate once again
    [self.window setRootViewController: self.navigationController];
}

@ 2由于navigationController将只是YES responde的自转,我们需要添加一些限制:扩展UINavicationController - > YourNavigationController和Interface Builder的链接。

@ 3改写从导航控制器中的“是烦人的新方法”。

由于这个类是定制只为这个应用程序也可以承担责任,它的控制器和在他们的地方回应。

-(BOOL)shouldAutorotate {

    if ([self.viewControllers firstObject] == YourObject)
    {
         return YES;
    }
    return NO;
}
- (NSUInteger)supportedInterfaceOrientations {
     if ([self.viewControllers firstObject] == YourObject)
    {
         return UIINterfaceOrientationMaskLandscape;
    }
    return UIInterfaceOrientationMaskPortrait;
}

我希望这能帮到您,



Answer 5:

从iOS 6的发布说明 :

现在,iOS的容器(如UINavigationController的)不咨询自己的孩子,以确定他们是否应该自动旋转。

请问您rootViewController传递shouldAutoRotate消息下来ViewController层次到你的VC?



Answer 6:

我用相同的方法,OP预iOS6的(本并关闭一个模态VC),以显示在横向模式下的单一视图控制器(所有其它部分中纵向)。 它打破了在iOS6的景观带VC纵向显示。

为了解决这个问题,我只是说在景观VC的preferredInterfaceOrientationForPresentation方法。 似乎做工精细的OS 5和OS 6现在。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft);
}

- (BOOL)shouldAutorotate
{
return NO;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{    
return UIInterfaceOrientationLandscapeLeft;
}


Answer 7:

嗨tryng很多不同的可能的解决方案,但没有成功后,我想出了以下解决方案希望它帮助!

我准备了一个食谱:)。

问题:你需要改变在iOS 6中使用navigationcontroller viewcontrollers的方向。

解:

步骤1.一个初始UIviewcontroler触发模态塞格斯到横向和纵向UInavigationControllers作为图为....

更深入地UIViewController1我们根据在AppDelegate中的全局变量需要2个塞格斯行动....

-(void)viewDidAppear:(BOOL)animated{
    if([globalDelegate changeOrientation]==0){
        [self performSegueWithIdentifier:@"p" sender:self];
    }
    else{
        [self performSegueWithIdentifier:@"l" sender:self];
    }

}

我们还需要一种方式回到肖像&| 景观....

- (IBAction)dimis:(id)sender {
    [globalDelegate setChangeOrientation:0];
    [self dismissViewControllerAnimated:NO completion:nil];
}

步骤2中的第一推UiViewControllers在每个NavigationController去与...

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

-(BOOL)shouldAutorotate{
    return YES;
}

步骤3在我们的UINavigationController的子类覆盖supportedInterfaceOrientations方法....

在customNavigationController我们.....

-(NSUInteger)supportedInterfaceOrientations{
    if([self.visibleViewController isKindOfClass:[ViewController2 class]]){

        return UIInterfaceOrientationMaskPortrait;
    }
    else{
        return UIInterfaceOrientationMaskLandscape;

    }

}

步骤4在故事板或代码,设置wantsFullScreenLayout标志是,以纵向和横向uinavigationcontrollers。



Answer 8:

尝试segueing到UINavigationController其使用类别或子类被指定期望的取向,那么原因请看到所需的VC。 阅读更多这里 。



Answer 9:

作为替代,你可以做用块相同的:

UIViewController *viewController    = [[UIViewController alloc] init];
viewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:viewController animated:NO completion:^{
    [self dismissViewControllerAnimated:NO completion:nil];
}];

此外,推新视图之前调用它。



Answer 10:

转到你Info.plist文件并进行更改



Answer 11:

我有同样的问题。 如果您想强制某个特定视图控制器出现在景观,做到这一点你推到导航堆栈权利之前。

UIInterfaceOrientation currentOrientation = [[UIApplication sharedApplication] statusBarOrientation];
        if (currentOrientation == UIInterfaceOrientationPortrait ||
            currentOrientation == UIInterfaceOrientationPortraitUpsideDown)
            [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeLeft];

        UIViewController *vc = [[UIViewController alloc] init];
        [self.navigationController pushViewController:vc animated:YES];
        [vc release];


Answer 12:

我解决它通过继承的UINavigationController并重写导航控制器如下的supportedInterfaceOrientations:

- (NSUInteger)supportedInterfaceOrientations
{
     return [[self topViewController] supportedInterfaceOrientations];
}

所有的控制器来实现自己理想的方向supportedInterfaceOrientations。



Answer 13:

我已经使用了以下解决方案。 在具有不同的取向比所有其他的一个视图控制器,我添加在prepareForSegue方法的取向检查。 如果目标视图控制器需要比当前显示的一个不同的接口取向,然后将消息发送强制的界面处的塞克期间旋转。

#import <objc/message.h>

...

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if(UIDeviceOrientationIsLandscape(self.interfaceOrientation))
    {
        UIInterfaceOrientation destinationOrientation;

        if ([[segue destinationViewController] isKindOfClass:[UINavigationController class]])
        {
            UINavigationController *navController = (UINavigationController *)[segue destinationViewController];
            destinationOrientation = [navController.topViewController preferredInterfaceOrientationForPresentation];
        } else
        {
            destinationOrientation = [[segue destinationViewController] preferredInterfaceOrientationForPresentation];
        }

        if ( destinationOrientation == UIInterfaceOrientationPortrait )
        {
            if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)])
            {
                objc_msgSend([UIDevice currentDevice], @selector(setOrientation:), UIInterfaceOrientationPortrait );
            }
        }
    }
}


文章来源: IOS 6 force device orientation to landscape