iPhone/iOS开启个人热点的相关位置调整小结
冬至已到,圣诞将近,最近公司项目实在太多,三四个项目反复的切换真的让人焦头烂额,趁今天有点空,把维护的三个项目顺利送出,刚好可以缕缕思路,记录一下最近遇到的问题。说不着急那是假的,客户一天天的催的确实令人心烦意乱,但是回过头来想想也确实不易,所以还是说服自己认真对待他们反馈的一个个问题,尽量做到让他们满意也让自己满意。有句话怎么说来,终于完成了,还好我没放弃。哈哈,闲言不多讲,说一下最近遇到解决的一个问题吧,由热点引起状态栏位置变化而导致自定义底部栏位置错位的问题。
关于热点的帖子网上确实不少,也给了很多的解决的方案。iPhone作为个人热点且有连接时,系统状态栏下面会多一行热点连接提示栏"Personal Hotspot: * Connection",纵向会下压20pt;当所有连接都断开时,热点栏消失,纵向高度恢复正常。
1.系统状态栏
APP_STATUSBAR_HEIGHT=[UIApplication sharedApplication].statusBarFrame.size.height,包含热点栏(如有)高度,标准高度为20pt,当有个人热点连接时,高度为40pt。
// iOS系统版本
// 标准系统状态栏高度
#define SYS_STATUSBAR_HEIGHT 20
// 热点栏高度
#define HOTSPOT_STATUSBAR_HEIGHT 20
// 导航栏(UINavigationController.UINavigationBar)高度
#define NAVIGATIONBAR_HEIGHT 44
// 工具栏(UINavigationController.UIToolbar)高度
#define TOOLBAR_HEIGHT 44
// 标签栏(UITabBarController.UITabBar)高度
#define TABBAR_HEIGHT 44
// APP_STATUSBAR_HEIGHT=SYS_STATUSBAR_HEIGHT+[HOTSPOT_STATUSBAR_HEIGHT]
#define APP_STATUSBAR_HEIGHT (CGRectGetHeight([UIApplication sharedApplication].statusBarFrame))
// 根据APP_STATUSBAR_HEIGHT判断是否存在热点栏
#define IS_HOTSPOT_CONNECTED (APP_STATUSBAR_HEIGHT==(SYS_STATUSBAR_HEIGHT+HOTSPOT_STATUSBAR_HEIGHT)?YES:NO)
// 无热点栏时,标准系统状态栏高度+导航栏高度
#define NORMAL_STATUS_AND_NAV_BAR_HEIGHT (SYS_STATUSBAR_HEIGHT+NAVIGATIONBAR_HEIGHT)
// 实时系统状态栏高度+导航栏高度,如有热点栏,其高度包含在APP_STATUSBAR_HEIGHT中。
#define STATUS_AND_NAV_BAR_HEIGHT (APP_STATUSBAR_HEIGHT+NAVIGATIONBAR_HEIGHT)
2.UIViewController.view.bounds.height
- SYSTEM_VERSION < 7.0,UIViewController.view.bounds.height包含导航栏高度,不包含系统状态栏高度,也不包含热点栏(如果有)。
- SYSTEM_VERSION ≥ 7.0,UIViewController.view.bounds.height包含标准系统状态栏高度和导航栏高度,但不包含热点栏(如果有)。
也即当有热点栏时,UIViewController.view.bounds.height都自动扣除了热点栏的高度,iOS<7.0不包含标准系统状态栏,iOS≥7.0包含标准系统状态栏。
由于iOS7把整个屏幕高度(包括状态栏,不包括热点栏)都作为了视图控制器的有效高度,因此从iOS6升级到iOS7时,会出现视图整体上移了一个状态栏的高度(20pt),并和上层的状态栏交叠在一起。
上面的这两段是借用的他们总结的一些说明性的东西,分析的还很详细,原理还是要懂得,以后遇到问题一定要学会总结,不然的话太容易遗忘。网上给了一些解决的思路,我参考了比较好的两篇博客,他们给的思路还是挺好的,但是还需要加一些处理和判断,下面我说一下解决问题的完整过程吧。正常来说热点引起的状态栏位置的调整有两种情况,一个是当前页面已经创建打开,另一个情况是页面尚未创建,下面来专门区分一下。
1、状态栏变化通知的处理和添加UIApplicationWillChangeStatusBarFrameNotification,
UIApplicationDidChangeStatusBarFrameNotification是状态栏变化会走的两个通知,可以在
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.navigationController.navigationBar setHidden:YES];
[[ NSNotificationCenter defaultCenter ] addObserver : self selector : @selector (statusBarFrameWillChange:) name : UIApplicationWillChangeStatusBarFrameNotification object : nil ];
[[ NSNotificationCenter defaultCenter ] addObserver : self selector : @selector (layoutControllerSubViews:) name : UIApplicationDidChangeStatusBarFrameNotification object : nil ];
CGRect statusBarRect = [[UIApplication sharedApplication] statusBarFrame];
if (statusBarRect.size.height == 40)
{
[mytable setFrame:CGRectMake(0, -20, 320, UI_View_Hieght+64-58)];
[bottomView setFrame:CGRectMake(0,UI_View_Hieght+64-58-20,320, 58)];
}
else
{
[mytable setFrame:CGRectMake(0, 0, 320, UI_View_Hieght+64-58)];
[bottomView setFrame:CGRectMake(0,UI_View_Hieght+64-58,320, 58)];
}
}
经过反复的测试发现,原来通知只会在页面已经创建打开这种情况下走,所以需要注册监听状态栏的通知,并作处理
#pragma mark-状态栏录音或通话状态通知
-(void)layoutControllerSubViews:(NSNotification *)notification
{
//[UIApplication sharedApplication].statusBarFrame.size.height=20;
CGRect statusBarRect = [[UIApplication sharedApplication] statusBarFrame];
if (statusBarRect.size.height == 40)
{
[mytable setFrame:CGRectMake(0, -20, 320, UI_View_Hieght+64-58)];
[bottomView setFrame:CGRectMake(0,UI_View_Hieght+64-58-20,320, 58)];
}
else
{
[mytable setFrame:CGRectMake(0, 0, 320, UI_View_Hieght+64-58)];
[bottomView setFrame:CGRectMake(0,UI_View_Hieght+64-58,320, 58)];
}
}
- (void)statusBarFrameWillChange:(NSNotification*)notification
{
//[self hideTabbar:self.statusBarHidden animated:YES];
//[[UIApplication sharedApplication] setStatusBarHidden:YES];
CGRect statusBarRect = [[UIApplication sharedApplication] statusBarFrame];
if (statusBarRect.size.height == 40)
{
[mytable setFrame:CGRectMake(0, -20, 320, UI_View_Hieght+64-58)];
[bottomView setFrame:CGRectMake(0,UI_View_Hieght+64-58-20,320, 58)];
}
else
{
[mytable setFrame:CGRectMake(0, 0, 320, UI_View_Hieght+64-58)];
[bottomView setFrame:CGRectMake(0,UI_View_Hieght+64-58,320, 58)];
}
}
另一种情况就是页面尚未打开前,热点已经连接,这样的话打开页面是不会走通知的地方,需要在
- (void)viewWillAppear:(BOOL)animated 加上上面的处理,和通知里面的代码是一样的,两个都是必须的,这样的话经过反复测试确实效果还是不错的,今天就说到这里吧先,思路终于清晰了也。
iPhone/iOS开启个人热点的相关位置调整小结相关推荐
- iPhone/iOS开启个人热点的纵向适配小结
http://blog.csdn.net/phunxm/article/details/42967035 一.iPhone创建个人热点 iPhone/iOS双环上网,即iPhone通过创建个人热点(P ...
- iphone个人热点无法开启_iPhone无法开启个人热点怎么回事 iPhone无法开启个人热点解决方法...
在如今,iphone手机是一代换一代,越来越多的人使用着苹果手机.当有好友流量不够用时,这时使用iPhone手机的用户可以开启个人热点,与自己的好友共享流量,但是也有些iPhone用户遇到无法开启个人 ...
- iOS开启个人热点的纵向适配
一.iPhone创建个人热点 iPhone/iOS双环上网,即iPhone通过创建个人热点(Personal Hotspot)实现共享上网,支持便携式Wi-Fi热点.蓝牙共享网络和USB共享网络. 1 ...
- iphone个人热点无法开启_iPhone无法开启个人热点怎么回事【解决方法】
在如今,iphone手机是一代换一代,越来越多的人使用着苹果手机.当有好友流量不够用时,这时使用iPhone手机的用户可以开启个人热点,与自己的好友共享流量,但是也有些iPhone用户遇到无法开启个人 ...
- iOS 15个人热点无法连接?10个修复技巧分享
iPhone的个人热点类似一个随身Wi-Fi,使用蜂窝数据将设备变成Wi-Fi热点,从而与其他设备共享网络数据. 但是升级到iOS 15后,很多iPhone 用户反馈个人热点停止工作.无法连接.频繁掉 ...
- 斐讯n1 linux连接wifi,斐讯 N1 部署 Docker 和 OpenWRT,并利用 Hostapd 开启 Wi-Fi 热点
刷入 Armbian 的 N1 可以通过安装 Docker 做很多事情,部署 OpenWRT 路由系统就是其中之一,同时利用 Hostapd 更可以开启 Wi-Fi 热点,方便作为一台便携路由使用. ...
- wlan连接的笔记本电脑+开启移动热点+手机无法连接【已解决】
前言: 首先我的问题是: Win10系统,开启移动热点后在手机界面可以搜索到热点,但就是连接不上!不提示"拒绝接入",不提示密码错误! 注释: 在尝试各种方法时,涉及到更改电脑设置 ...
- 嵌入式linux开启无线热点模式(AP),联机设备通过 wifi 热点访问外网
嵌入式linux开启无线热点模式(AP),联机设备通过 wifi 热点访问外网. 一.内核和文件系统. 1.确认已移植好了hostapd. 2.确认文件系统中已移植好了iptables. iptabl ...
- Android 9.0 默认开启WLAN热点设置默认热点名称和密码
1.概述 在android 9.0的系统产品开发中,在项目产品需求中,对于wifi和默认热点的使用也是常有的功能,在最近的项目开发中,需要开启WLAN热点,然后设置WLAN的默认热点 的名称和密码功能 ...
最新文章
- 10只机器狗拉卡车!井然有序,毫不费力 | 极客头条
- ​​​​​​​DL之RNN/LSTM/GRU:RNN/LSTM/GRU算法动图对比、TF代码定义之详细攻略
- tensorflow2.x版本无法调用gpu的一种解决方法
- 七十六、 数据结构二叉树及其代码实现
- python list 查找find_List 泛型 集合中 Find 的用法
- QT-Creator+SDK+编译器+自定义配置
- R作图-----北京市2017年一季度AQI指数日历热图
- linux设置基础软件仓库时,安装centos系统时设置基础软件仓库出错
- 数据层优化-jdbc连接池简述、druid简介
- 如何避免向下传递回调?
- MySQL数据库操作指令
- JAVA课程设计(小游戏贪吃蛇)完整源码附素材(三)
- python 安装包时出现:SyntaxError: invalid syntax
- X230 安装 EI Capitan 10.11.5 驱动篇
- 扫描二维码 扫码打电话 可以打电话的二维码
- Revit模型如何在网页上显示
- QT中实现二维码图片生成
- html背景图片不重叠铺满,html中背景图片铺满页面没有重复的效果
- 原生ajax传值php,原生ajax上传图片,php后台处理总结
- JPEG2000图像压缩算法学习