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

时间:2014-05-05 13:27:03

标签: objective-c ios7 landscape-portrait

我创建了一个Iphone和Ipad的应用程序,它由两个带导航控制器的主视图组成。导航控制器插入tabBar控制器。 我想将主视图锁定到纵向方向,只有导航控制器的子视图触发了Partrait和Landscape的可能性。 可能吗? 我该怎么办?

谢谢

4 个答案:

答案 0 :(得分:12)

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

这是你做的:

确保在info.plist文件中支持的方向列表中列出纵向和横向。 (默认的应用程序模板包括iPad的所有方向,而iPhone的所有方向都是颠倒的,这可能是你想要的。)

您希望在要限制为纵向的视图控制器中实现方法supportedInterfaceOrientations:

- (NSUInteger)supportedInterfaceOrientations
{
  return UIInterfaceOrientationMaskPortrait;
} 

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

只有在支持6.0之前的操作系统版本时才需要旧方法shouldAutorotateToInterfaceOrientation:

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

答案 1 :(得分:3)

以下是基于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的情况,它实际上回复了旋转事件。

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

答案 2 :(得分: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);

}

答案 3 :(得分:-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;
    }