调用willRotateToInterfaceOrientation时,iOS 7与iOS 8的主屏幕边界大小不同

时间:2014-11-09 00:22:14

标签: ios objective-c ios7 rotation ios8

我知道iOS 8现在返回当前界面方向的正确屏幕尺寸。要获得iOS 7中方向的设备宽度,如果方向是纵向,则必须返回高度,如果方向是纵向,则必须返回宽度,但是您可以始终在iOS 8中返回宽度。我已经考虑了这一点。应用程序我正在开发支持iOS 7和8的应用程序。(参见下面的代码)

然而,我注意到另一个区别。如果我调用这个方法并传入它的方向(从willRotateToInterfaceOrientation获得),在iOS 7上它会返回正确的宽度,但在iOS 8上它返回旧的宽度(当前)方向。

当我知道iOS 8和iOS 7上目前或将会出现的方向时,如何获得屏幕宽度?

虽然我可以只交换iOS 8的宽度和高度,但在设备未转换到新方向时调用此函数时返回的值不正确。我可以创建两种不同的方法,但我正在寻找一种更清洁的解决方案。

- (CGFloat)screenWidthForOrientation:(UIInterfaceOrientation)orientation
{
    NSString *reqSysVer = @"8.0";
    NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
    if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending) {
        return [UIScreen mainScreen].bounds.size.width;
    }

    CGRect screenBounds = [UIScreen mainScreen].bounds;
    CGFloat width = CGRectGetWidth(screenBounds);
    CGFloat height = CGRectGetHeight(screenBounds);

    if (UIInterfaceOrientationIsPortrait(orientation)) {
        return width;
    } else if (UIInterfaceOrientationIsLandscape(orientation)) {
        return height;
    }
    return width;
}

用例:

运行iOS 7的iPad:

  • [self screenWidthForOrientation:[UIApplication sharedApplication].statusBarOrientation]中调用viewDidAppear会返回正确的宽度
  • [self screenWidthForOrientation:toInterfaceOrientation]中调用willRotateToInterfaceOrientation:toInterfaceOrientation:duration会返回正确的宽度

运行iOS 8的iPad:

  • [self screenWidthForOrientation:[UIApplication sharedApplication].statusBarOrientation]中调用viewDidAppear会返回正确的宽度
  • [self screenWidthForOrientation:toInterfaceOrientation]中调用willRotateToInterfaceOrientation:toInterfaceOrientation:duration会返回错误的宽度(旋转发生前的当前状态)

2 个答案:

答案 0 :(得分:2)

这是我在应用约束之前计算iOS7 / iOS8正确宽度和高度的代码。

- (void) applyConstraints:(UIInterfaceOrientation)toInterfaceOrientation
{   
    CGSize screenSize = [[UIScreen mainScreen] bounds].size;
    CGFloat heightOfScreen;
    CGFloat widthOfScreen;
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
        // iOS 8.0 and later code here
        if ([UIApplication sharedApplication].statusBarOrientation == toInterfaceOrientation) {
            heightOfScreen = screenSize.height;
            widthOfScreen = screenSize.width;
        } else {
            heightOfScreen = screenSize.width;
            widthOfScreen = screenSize.height;
        }
    } else {
        if (UIDeviceOrientationIsLandscape(toInterfaceOrientation)) {
            heightOfScreen = screenSize.width;
            widthOfScreen = screenSize.height;
        } else {
            heightOfScreen = screenSize.height;
            widthOfScreen = screenSize.width;
        }
    }
    //Applying new constraints
    ...
}

它不是那么漂亮,但它有效=)

答案 1 :(得分:0)

在iOS 8中,旋转和坐标系统的整体性质完全改变了。您不应该使用willRotate等任何事件;他们被弃用了。整个应用程序旋转,包括屏幕。没有更多的旋转变换;整个应用程序(屏幕,窗口,根视图)变得越来越宽,这就是你知道发生了什么事情(或者你可以注册听到状态栏改变它的方向)。如果您想知道设备坐标,与旋转无关,那就是新屏幕坐标空间的用途(fixedCoordinateSpace是不旋转的坐标空间。)