Xcode:收到警告“从枚举类型 UIDeviceOrientation 进行隐式转换”

问题描述 投票:0回答:2

全面警告:

Implicit conversion from enumeration type 'UIInterfaceOrientation' to different enumeration type 'UIDeviceOrientation'

上线:

[self orientationChanged:interfaceOrientation];

方法是这样的:

- (void)orientationChanged:(UIInterfaceOrientation)interfaceOrientation 

我真的不明白这个警告是从哪里来的。

objective-c xcode uiinterfaceorientation
2个回答
98
投票

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] 

0
投票

现在到了 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.