全面警告:
Implicit conversion from enumeration type 'UIInterfaceOrientation' to different enumeration type 'UIDeviceOrientation'
上线:
[self orientationChanged:interfaceOrientation];
方法是这样的:
- (void)orientationChanged:(UIInterfaceOrientation)interfaceOrientation
我真的不明白这个警告是从哪里来的。
UIDeviceOrientation
指设备的物理方向,而 UIInterfaceOrientation
指用户界面的方向。当你调用你的方法时
[self orientationChanged:interfaceOrientation];
当您根据方法应该使用
UIDeviceOrientation
时,您很可能会传递 UIInterfaceOrientation
。
稍微扩展一下这一点,
UIDeviceOrientation
是UIDevice
类的属性,并且有以下可能的值:
- 无法确定UIDeviceOrientationUnknown
- 主页按钮朝下UIDeviceOrientationPortrait
- 主页按钮朝上UIDeviceOrientationPortraitUpsideDown
- 主页按钮朝右UIDeviceOrientationLandscapeLeft
- 主页按钮朝左UIDeviceOrientationLandscapeRight
- 设备平坦,屏幕朝上UIDeviceOrientationFaceUp
- 设备平坦,屏幕朝下UIDeviceOrientationFaceDown
至于
UIInterfaceOrientation
,它是UIApplication
的属性,只包含4种可能,分别对应状态栏的方向:
UIInterfaceOrientationPortrait = UIDeviceOrientationPortrait,
UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,
UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight,
UIInterfaceOrientationLandscapeRight = UIDeviceOrientationLandscapeLeft
要获得
UIDeviceOrientation
,请使用
[[UIDevice currentDevice] orientation]
为了得到
UIInterfaceOrientation
,你使用
[[UIApplication sharedApplication] statusBarOrientation]
现在到了 2024 年,
[UIApplication sharedApplication].statusBarOrientation
已被弃用。
这就是从 iOS13+ 开始获得界面方向的方法:
UIInterfaceOrientation interfaceOrientation;
id windowScene = UIApplication.sharedApplication.connectedScenes.allObjects.firstObject;
if ([windowScene isKindOfClass:[UIWindowScene class]]) {
interfaceOrientation = ((UIWindowScene*)windowScene).interfaceOrientation;
} else {
interfaceOrientation = UIInterfaceOrientationUnknown;
}