关于UIDeviceOrientation的误区

前情提要:

公司的SDk需要在登录时显示顶部通知,于是写了一个自定义的banner

基本上就是一个类方法

+ (void)showWithUserName:(NSString *)userID andLogo:(UIImage * _Nullable)logo

然后创建banner view,先定义size

- (void)bannerSize {
    
    if ([UIDevice currentDevice].orientation == UIDeviceOrientationPortrait || [UIDevice currentDevice].orientation == UIDeviceOrientationPortraitUpsideDown) {
        _width = ScreenWidth;
    } else {
        _width = ScreenWidth * 2/3;
    }

根据UIDevice的orientation属性来判断当前是竖屏还是横屏,如果是横屏有空间那么banner只占屏幕宽度的2/3, 如果是竖屏,那么banner占整个屏幕宽度

大概是这种感觉

后来有的时候发现banner出现的宽度有时会变窄,导致放不下所有文字,而且是不定时出现,之前一直没有详细追究,后来经过仔细重复试验,发现似乎跟设备的方向有关系,具体表现为 手持的时候没有问题,但是放在桌面上就会出现。

联系到之前的那段判断UIDevice方向的代码,终于找到了原因

仔细看了下UIDeviceOrientation这个枚举,原来除了Portrait、Landscape,还有FaceUP Facedown 这两个状态(手机水平朝上和水平朝下) 显然对布局是没什么用的。

其实布局需要根据屏幕尺寸的时候还是使用iOS的Size Classes来确定比较好,第一不需要太多代码,第二也具有灵活性。

后来这个banner的 大小确定为根据字体大小和logo大小了

之前很多网上资料都用这个UIDevice来布局,其实这种做法算是不正确的。

又被苹果上了一课啊。 😅