如何锁定纵向方向以仅在 ios 7 中查看

问题描述 投票:0回答:4

我已经为 Iphone 和 Ipad 创建了一个应用程序,它由两个带导航控制器的主视图组成。导航控制器被插入到 tabBar 控制器中。 我想将主视图锁定为纵向方向,并且只有导航控制器的子视图触发可能的方向为 Partrait 和横向。 是否可以? 我该怎么办?

谢谢

ios objective-c ios7 landscape-portrait
4个回答
12
投票

到目前为止给出的两个答案都是错误的。

这就是你要做的:

确保您在 info.plist 文件中支持的方向列表中列出了纵向和横向。 (默认的应用程序模板包括 iPad 的所有方向,以及 iPhone 的除纵向倒置之外的所有方向,这可能正是您想要的。)

您想要在要限制为纵向的视图控制器中实现方法

supportedInterfaceOrientations:

- (NSUInteger)supportedInterfaceOrientations
{
  return UIInterfaceOrientationMaskPortrait;
} 

任何包含该代码的视图控制器将仅支持纵向。所有其他人都将支持您的 info.plist 中列出的所有方向。

仅当您支持 6.0 之前的操作系统版本时才需要旧方法

shouldAutorotateToInterfaceOrientation:

如果有时可能返回 NO(不旋转),则只需要实现 shouldAutorotate 方法。)


4
投票

这是基于

UIViewController
类别和方法调配的通用方法。

//  UIViewController+Orientation.h
@interface UIViewController (Orientation)

- (void)setOrientation:(NSUInteger)orientation;

@end

//  UIViewController+Orientation.m
#import "UIViewController+Orientation.h"
#import <objc/runtime.h>

static NSUInteger __orientation = UIInterfaceOrientationMaskAll;

@implementation UIViewController (Orientation)

+ (void)load
{
    Method original, swizzled;
    original = class_getInstanceMethod(self, @selector(viewWillDisappear:));
    swizzled = class_getInstanceMethod(self, @selector(swizzled_viewWillDisappear:));
    method_exchangeImplementations(original, swizzled);
}

- (void)swizzled_viewWillDisappear:(BOOL)animated
{
    __orientation = UIInterfaceOrientationMaskAll;
    [self swizzled_viewWillDisappear:animated];
}

- (NSUInteger)supportedInterfaceOrientations
{
    return __orientation;
}

- (void)setOrientation:(NSUInteger)orientation
{
    __orientation = orientation;
}

@end

现在您可以通过在

orientation
 中设置 
viewWillAppear:

来固定任何控制器的方向
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    self.orientation = UIInterfaceOrientationMaskPortrait;
}

Swizzling 关心控制器更改时的自动释放方向锁定。

此方法适用于所有类型的控制器,包括 TabbarViewController 和 UINavigationController 的情况,它们实际上响应旋转事件。

人们甚至可以在应用程序中创建一个锁定按钮,该按钮将获取当前方向并通过类别将其设置为固定。


0
投票

是的,当然你可以做到。

下面的代码强制横向视图控制器, 您可以修改为纵向。 我用它来 iPhone。

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

    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft animated:NO];
    CGAffineTransform landscapeTransform = CGAffineTransformMakeRotation(degreesToRadian(270));
    landscapeTransform = CGAffineTransformTranslate (landscapeTransform, 0.0, 0.0);
    [[self navigationController].view setTransform:landscapeTransform];
    //NSLog(@"%f %f",self.view.frame.size.width,self.view.frame.size.height);

    self.navigationController.view.bounds = CGRectMake(0.0, 0.0, self.width, self.height); 
    self.navigationController.navigationBar.frame = CGRectMake(0.0, y, self.width, 44.0);
    [appdelegate stopProgressIndicator];

}

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

    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO];
    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, self.height, self.width);
    self.navigationController.navigationBar.frame = CGRectMake(0.0, y, self.height, 44.0);

}

-1
投票

将其放入所有课程中......

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {

        if ([[[UIDevice currentDevice] systemVersion] integerValue]<7.0) {
            return UIInterfaceOrientationLandscapeRight|UIInterfaceOrientationLandscapeLeft;
        }else{
            return UIInterfaceOrientationPortrait;
        }
    }
    -(BOOL) shouldAutorotate {

        return NO;
    }
    -(NSUInteger)supportedInterfaceOrientations{
        return UIInterfaceOrientationMaskAll;
    }
    -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{

        if ([[[UIDevice currentDevice] systemVersion] integerValue]<7.0) {
            return UIInterfaceOrientationLandscapeRight|UIInterfaceOrientationLandscapeLeft;
            return YES;
        }else{
            return UIInterfaceOrientationPortrait;
        }

        return NO;
    }
© www.soinside.com 2019 - 2024. All rights reserved.