ios 检查设备距离与电池状态及判断是否是Retina显示屏

通过UIDevice类所提供的API,开发者可以追踪设备的某些特征,比方说电池的状态以及距离感应器的状态等。

1、启用与禁用距离感应器

目前来说,距离感应器是iPhone特有的功能。iPod touch和iPad并没有提供距离感应器。除非我们有强烈的理由要判断iPhone与用户是否贴的很近,否则距离感应器没有多大用处。

启用距离感应器之后,他的主要任务就是判断设备正前方是否有比较大的物体。如果有,就关掉屏幕,并发出一条通用的通知。物体若是远离设备,则屏幕会重新亮起。用户在打电话时,耳朵可能会碰到屏幕,而有了距离感应器之后,我们就能防止用户无意间碰到某个按钮或拨出某个号码。有些手机保护壳设计的不够好,可能会使iPhone的距离感应器无法正常运作。

Siri也会使用距离感应器。如果把电话放在耳朵旁边,他就会记录下用户所说的问题,并给出答复。Siri的语音界面并不依赖于可视的GUI。

我们用UIDevice类来切换距离感应器,并订阅UIDeviceProvimityStateDidChangeNotification通知,以捕获状态变化。两种状态分别是on和off。如果UIDevice的proximityState属性返回YES,就说明距离感应器已经激活了。

2、监控电池状态

我们可以用编程的方式来追踪电池及充电状态。通过相关的API,开发者可以知道电池的电量,以及设备是否接入了电源。电量是个浮点值,1表示完全充满,0表示完全耗尽。在执行非常耗电操作之前,我们可以通过这个值了解设备大概还剩下多少电。

我们可以在电池状态发生改变时响应通知,以便监控这些状态。如此一来,就可以捕获随时发生的事件了。比方说,电池何时彻底充满电,用户何时将设备接入电源重新充电,以及用户何时把设备与电源断开等。

把batteryMonitoringEnabled属性设为YES,即可开始监控。在监控期间,UIDevice类会在电池状态或电量发生变化时产生通知。我们可以不等接到通知就直接去检查这些值。虽然苹果公司并未承诺将以何种频率来投递关于电量变化的通知,但是大家只要测试一下就会发现,通知的投递频率还是相当规律的。

 (void)peekAtBatteryState
{
    NSArray *stateArray = @[@"battery state is unknown",
                            @"battery is not plugged into a charging source",
                            @"battery is charging",
                            @"battery state is full"];
    NSString *status = [NSString stringWithFormat:@"battery state:%@,battery level:%0.2f@%%",stateArray[[UIDevice currentDevice].batteryState],[UIDevice currentDevice].batteryLevel * 100];
    NSLog(@"%@",status);
}

- (void)updateTitle
{
    self.title = [NSString stringWithFormat:@"Proximity %@",[UIDevice currentDevice].proximityMonitoringEnabled ? @"On" : @"Off"];
}

- (void)toggle:(id)sender
{

    BOOL isEnabled = [UIDevice currentDevice].proximityMonitoringEnabled;
    [UIDevice currentDevice].proximityMonitoringEnabled = !isEnabled;
    [self updateTitle];
}

- (void)loadView
{
    self.view = [[UIView alloc] init];
    self.navigationItem.rightBarButtonItem = BARBUTTON_TARGET(@"Toggle", @selector(toggle:));
    [self updateTitle];
    
    [[NSNotificationCenter defaultCenter] addObserverForName:UIDeviceProximityStateDidChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
        NSLog(@"the proximity sensor %@",[UIDevice currentDevice].proximityState ? @"will now blank the screen" : @"will now restore the screen");
    }];
    
    [[NSNotificationCenter defaultCenter] postNotificationName:UIDeviceProximityStateDidChangeNotification object:nil];
    
    [[UIDevice currentDevice] setBatteryMonitoringEnabled:YES];
    
    [[NSNotificationCenter defaultCenter] addObserverForName:UIDeviceBatteryStateDidChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
        NSLog(@"battery State Change");
        [self peekAtBatteryState];
    }];
    
    [[NSNotificationCenter defaultCenter] postNotificationName:UIDeviceBatteryStateDidChangeNotification object:nil];
    
    [[NSNotificationCenter defaultCenter] addObserverForName:UIDeviceBatteryLevelDidChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
        NSLog(@"battery level   change");
        [self peekAtBatteryState];
    }];
    [[NSNotificationCenter defaultCenter] postNotificationName:UIDeviceBatteryLevelDidChangeNotification object:nil];
}

3、判断设备是否具有Retina显示屏

近年来,苹果公司为很多设备都装配了Retina显示屏,只有一些成本较低的设备没有升级。根据苹果公司的说法,Retina显示屏的像素密度很高,以致人眼无法分辨出单个的像素。应用程序可以利用清晰度较好的显示屏开展示分辨率较高的图像。

UIScreen类提供了一种简单的办法,可以判断当前设备有没有内置Retina显示屏。这种办法就是检测UIScreen的scale属性。在把逻辑坐标空间(该空间的坐标以点为单位,每个点大约是1/160英寸)转换到设备坐标空间(该空间的坐标以像素为单位)时,该属性用来表示换算的倍数。对于标准的显示屏来说,这个倍数是1,也就是说,1个点对应1个像素。而对于Retina显示屏来说,这个倍数是2,也就是说,1个点会用4个像素来显示:

- (BOOL)hasRetianDisplay
{
    return ([UIScreen mainScreen].scale == 2.0f);
}
UIScreen类还提供了两个有用的属性,用来表示显示区域的尺寸。bounds属性代表屏幕的外界矩形,他所用的计量单位是点。该属性表示屏幕的总大小,这与屏幕上是否有状态栏、导航栏或标签栏等元件无关。applicationFrame属性也是以点来计量的,它表示应用程序初始化的视图尺寸。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值