6

我知道以前有人问过类似的问题,但这是一个更具体的用例(从静态库控制方向,不能在根视图控制器中编写)。

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

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

-(BOOL)shouldAutorotate{
return NO;
}

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

当我将相同的代码放在根视图控制器中时,它可以完美运行,应用程序不再自动旋转。但是,这对我们来说不是一个选项,因为在生产中我们将无法访问客户端的根视图控制器。有没有办法从非根视图控制器锁定视图方向,或仅锁定单个视图控制器的方向?还有什么其他方法可以实现我没有想到的我们需要的东西吗?如果可能的话,希望在 iOS <= 6 中工作的解决方案

4

1 回答 1

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

    }

}

}

  • (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{

    UIInterfaceOrientation 方向 = [[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 弧度 = atan2f(self.view.transform.b, self.view.transform.a); if (radians!=M_PI_2) { [[self view] setTransform:CGAffineTransformMakeRotation(M_PI_2)];

    }
    

    }别的{

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

    }
    

    } }

于 2015-09-30T14:25:55.230 回答