禁用单个UIView的自动旋转

时间:2010-02-03 11:32:19

标签: iphone cocoa-touch uikit uiviewcontroller

好吧,这看起来应该相对简单,但我一直在谷歌搜索大部分时间,似乎无法找到我需要的东西。

我有一个视图控制器,它有几个不同的部分:背景视图,标题视图和几个按钮。现在,我希望标题和按钮正确自动旋转(当我从shouldAutorotateToInterfaceOrientation返回YES时,它们会这样做),但在任何情况下都不应该旋转背景视图。有没有正确的方法来做到这一点?

4 个答案:

答案 0 :(得分:5)

如果您不希望临时旋转背景视图,然后将背景更改为具有正确的方向,则需要关闭视图的自动旋转。没有两种方式。

您需要自己处理按钮的旋转。您可以制作一个漂亮的布局或者将它们放在例如Scrollview上,然后调整它。

无论哪种方式,你都需要添加一个观察者来自己旋转它,

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:)
                                                 name:UIDeviceOrientationDidChangeNotification object:nil];

在didRotate中你可以调整大小,如果你愿意,可以使用漂亮的动画过渡。

- (void) didRotate:(NSNotification *)notification {
 int ori=1;
    UIDeviceOrientation currOri = [[UIDevice currentDevice] orientation];
    if ((currOri == UIDeviceOrientationLandscapeLeft) || (currOri == UIDeviceOrientationLandscapeRight)) ori=0;
}

希望对你进行排序。如果导航栏或状态栏导致View隐藏在顶部栏下方,则有一些方法可以解决这个问题。

答案 1 :(得分:2)

还有另外一项我想过的工作......

您可以使用:

bgView.transform = CGAffineTransformMakeRotate(angle);

您应该根据方向计算角度(可以是M_PI / 2,M_PI或3 * M_PI / 2)......

您可以在- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration中使用此功能,并使用动画包装它,该动画将为屏幕方向动画设置精确的持续时间:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    // Decide what will be the angle...

    // Make the animation
    [UIView beginAnimations:@"orientationChange" context:nil];
    [UIView setAnimationDuration: duration];
    bgView.transform = CGAffineTransformMakeRotate(angle);
    [UIView commitAnimations];
}

请注意,由于顶栏...

,视图的大小可能会更改

另请注意,我自己从未尝试过......

答案 2 :(得分:2)

有一种“正确”的方式:允许框架旋转界面(另一方面,当弹出另一个视图控制器时你会遇到问题)但是覆盖视图的动画。

我有一个全屏视图,其中包含我不想旋转的所有内容,称为_fixedView。在故事板中,我确保所有自动调整(“大小检查器”中的红色箭头)都已关闭,因此视图将始终位于屏幕的中心。

然后在我的视图控制器中,我有这个覆盖:

-(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [UIView animateWithDuration:duration
                     animations:^{
        if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) {
            _fixedView.transform = CGAffineTransformMakeRotation(M_PI_2);
        } else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) {
            _fixedView.transform = CGAffineTransformMakeRotation(-M_PI_2);
        } else if (toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
            _fixedView.transform = CGAffineTransformMakeRotation(M_PI);
        } else {
            _fixedView.transform = CGAffineTransformIdentity;
        }}];
}

这样_fixedView中的所有内容都是完全修复的(对于描述性名称,这是怎么回事?呃?)状态栏和我的工具栏正常旋转。

答案 3 :(得分:1)

我不知道'正确'的方式,但解决方法是在两个方向创建背景视图,只需更改背景视图。但是很好的问题 - 将有兴趣看看人们提出什么作为解决方案。