我知道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
会返回错误的宽度(旋转发生前的当前状态)答案 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
是不旋转的坐标空间。)