仅针对一个视图控制器从静态库维护iOS纵向方向

时间:2013-06-05 19:13:48

标签: iphone ios objective-c ios6 uiviewcontroller

我之前已经问过类似的问题,但这是一个更具体的用例(从静态库控制方向,不能在根视图控制器中写入)。

我有一个静态库,它将UI元素作为叠加层添加到传递的视图控制器(客户端的根视图控制器)作为子视图。问题是我们的UI元素仅支持纵向方向,而我们客户的应用程序可能同时支持纵向和横向。这很好,只要我们的UI元素在客户端的视图不会自动旋转时就可以了。

我想仅为我们的视图控制器将方向锁定为纵向。在iOS 6中,当我在我的库的视图控制器中使用以下代码时,它根本不会影响自动旋转的行为:

-(BOOL)shouldAutorotate{
return NO;
}

-(NSInteger)supportedInterfaceOrientations{
    NSInteger orientationMask = 0;
    if ([self shouldAutorotateToInterfaceOrientation: UIInterfaceOrientationPortrait])
        orientationMask |= UIInterfaceOrientationMaskPortrait;
    return orientationMask;
}

当我在根视图控制器中放入相同的代码时,它完美地运行,应用程序不再自动旋转。但是,这不是我们的选择,因为在生产中我们将无法访问客户端的根视图控制器。有没有办法从NOT根视图控制器锁定视图方向,或仅锁定单个视图控制器的方向?任何其他方式实现我们需要的,我没有想到的?希望能够在iOS中使用的解决方案<= 6(如果可能的话)

1 个答案:

答案 0 :(得分:0)

在整个应用程序中,您无法仅锁定一个视图控制器的方向。因此,您必须在视图启动和方向更改时设置父视图框架的变换角度。

您为这些视图控制器类添加代码

- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) {
    [[self view] setBounds:CGRectMake(0, 0, self.view.frame.size.height, self.view.frame.size.width)];
    CGFloat radians = atan2f(self.view.transform.b, self.view.transform.a);
    if (radians!=M_PI_2) {
        [[self view] setTransform:CGAffineTransformMakeRotation(M_PI_2)];

    }

}

}

  • (无效)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {

    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; if(orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight){    [[self view] setBounds:CGRectMake(0,0,self.view.frame.size.height,self.view.frame.size.width)];     CGFloat radians = atan2f(self.view.transform.b,self.view.transform.a);     if(radians!= M_PI_2){         [[self view] setTransform:CGAffineTransformMakeRotation(M_PI_2)];

    }
    

    }否则{

    [[self view] setBounds:CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height)];     CGFloat radians = atan2f(self.view.transform.b,self.view.transform.a);     if(radians!= 0){         [[self view] setTransform:CGAffineTransformMakeRotation(0)];

    }
    

    } }