ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

判断“竖排锁定”是否打开

2019-09-06 10:04:28  阅读:273  来源: 互联网

标签:锁定 obj isOn 竖排 valueForKeyPath array 打开


####问题来由:
由于项目需要仅支持查看图片横竖屏转换,其他界面强制竖屏。因为转换过程中【状态栏】,【导航栏】需要隐藏显示等操作,【开启热点时状态栏】高度又从20变成40。界面在不断的跳转过程中加上热点的开闭,把手机搞“懵逼”了,一会界面上移,一会下移。
####调整思路:
所有界面强制竖屏,由【陀螺仪】来判断设备的方向。陀螺仪和系统的横竖屏无关,此时就要获取设备是否开启“竖排锁定”,如果开启竖排锁定就禁用陀螺仪,如果关闭竖排锁定就启用陀螺仪。iOS 12以后获取“竖排锁定”的方法不准确,如下,再次又换了思路

//判断设备“竖屏锁定”的状态
inline BOOL isProtraitLockOn()
{
    BOOL isOn = NO;
    if([[[UIApplication sharedApplication] valueForKeyPath:@"statusBar"] isKindOfClass:NSClassFromString(@"UIStatusBar_Modern")]) {
        // iPhone X
        NSDictionary *barDic = [[[[UIApplication sharedApplication] valueForKeyPath:@"statusBar"] valueForKeyPath:@"statusBar"]valueForKeyPath:@"_displayItemStates"];
        NSArray *values = [barDic allValues];
        NSLog(@"value = %@",values);//1️⃣
        for (id obj in values) {
            NSString *identifier = [[obj valueForKeyPath:@"identifier"] description];
            if ([identifier isEqualToString:@"_UIStatusBarIndicatorRotationLockItem"]) {
                NSString *flag =[[obj valueForKeyPath:@"dataEnabled"] description];
                if ([flag isEqualToString:@"1"]) {
                    NSLog(@"竖排方向锁定打开");
                    isOn = YES;

                }else{ //0
                    NSLog(@"竖排方向锁定关闭");
                    isOn = NO;
                }
                break;
            }
        }

    } else{
        id bar =[[UIApplication sharedApplication] valueForKeyPath:@"statusBar"];
        NSArray *array = [[bar valueForKeyPath:@"foregroundView"] subviews];
        //获取状态栏上的图标和状态,列入服务商,网络类型,时间,电池电量,蓝牙,等等
        NSLog(@"array = %@",array); //2️⃣
        for (id obj in array) {
            id item = [obj valueForKey:@"item"];
            int type = [[item valueForKey:@"type"] intValue];
            if (type == 18) { //18就是竖排锁定,ios 12以后不管“竖排锁定”打开与否。18都存在,所以本方法不准
                isOn = YES;
                break;
            }
        }
    }

    return isOn;
}

#tip:可以查看1️⃣2️⃣两个打印,获取状态栏上其他元素,进行相应操作。

####最终思路:

[[UIDevice currentDevice]beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientaionDidChange) name:UIDeviceOrientationDidChangeNotification object:[UIDevice currentDevice]];

-(void)deviceOrientaionDidChange{
    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;

    if (orientation == UIDeviceOrientationLandscapeLeft) {
      //横屏了
    }else if (orientation == UIDeviceOrientationLandscapeRight){
        //横屏
    }else{
       //其他都默认竖屏
    }
}


标签:锁定,obj,isOn,竖排,valueForKeyPath,array,打开
来源: https://blog.csdn.net/hubangguo/article/details/100573457

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有