冬至已到,圣诞将近,最近公司项目实在太多,三四个项目反复的切换真的让人焦头烂额,趁今天有点空,把维护的三个项目顺利送出,刚好可以缕缕思路,记录一下最近遇到的问题。说不着急那是假的,客户一天天的催的确实令人心烦意乱,但是回过头来想想也确实不易,所以还是说服自己认真对待他们反馈的一个个问题,尽量做到让他们满意也让自己满意。有句话怎么说来,终于完成了,还好我没放弃。哈哈,闲言不多讲,说一下最近遇到解决的一个问题吧,由热点引起状态栏位置变化而导致自定义底部栏位置错位的问题。

    关于热点的帖子网上确实不少,也给了很多的解决的方案。iPhone作为个人热点且有连接时,系统状态栏下面会多一行热点连接提示栏"Personal Hotspot: * Connection",纵向会下压20pt;当所有连接都断开时,热点栏消失,纵向高度恢复正常。

1.系统状态栏

APP_STATUSBAR_HEIGHT=[UIApplication sharedApplication].statusBarFrame.size.height,包含热点栏(如有)高度,标准高度为20pt,当有个人热点连接时,高度为40pt。

// iOS系统版本

#define SYSTEM_VERSION    [[[UIDevice currentDevice] systemVersion] doubleValue]

// 标准系统状态栏高度

#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开启个人热点的相关位置调整小结相关推荐

  1. iPhone/iOS开启个人热点的纵向适配小结

    http://blog.csdn.net/phunxm/article/details/42967035 一.iPhone创建个人热点 iPhone/iOS双环上网,即iPhone通过创建个人热点(P ...

  2. iphone个人热点无法开启_iPhone无法开启个人热点怎么回事 iPhone无法开启个人热点解决方法...

    在如今,iphone手机是一代换一代,越来越多的人使用着苹果手机.当有好友流量不够用时,这时使用iPhone手机的用户可以开启个人热点,与自己的好友共享流量,但是也有些iPhone用户遇到无法开启个人 ...

  3. iOS开启个人热点的纵向适配

    一.iPhone创建个人热点 iPhone/iOS双环上网,即iPhone通过创建个人热点(Personal Hotspot)实现共享上网,支持便携式Wi-Fi热点.蓝牙共享网络和USB共享网络. 1 ...

  4. iphone个人热点无法开启_iPhone无法开启个人热点怎么回事【解决方法】

    在如今,iphone手机是一代换一代,越来越多的人使用着苹果手机.当有好友流量不够用时,这时使用iPhone手机的用户可以开启个人热点,与自己的好友共享流量,但是也有些iPhone用户遇到无法开启个人 ...

  5. iOS 15个人热点无法连接?10个修复技巧分享

    iPhone的个人热点类似一个随身Wi-Fi,使用蜂窝数据将设备变成Wi-Fi热点,从而与其他设备共享网络数据. 但是升级到iOS 15后,很多iPhone 用户反馈个人热点停止工作.无法连接.频繁掉 ...

  6. 斐讯n1 linux连接wifi,斐讯 N1 部署 Docker 和 OpenWRT,并利用 Hostapd 开启 Wi-Fi 热点

    刷入 Armbian 的 N1 可以通过安装 Docker 做很多事情,部署 OpenWRT 路由系统就是其中之一,同时利用 Hostapd 更可以开启 Wi-Fi 热点,方便作为一台便携路由使用. ...

  7. wlan连接的笔记本电脑+开启移动热点+手机无法连接【已解决】

    前言: 首先我的问题是: Win10系统,开启移动热点后在手机界面可以搜索到热点,但就是连接不上!不提示"拒绝接入",不提示密码错误! 注释: 在尝试各种方法时,涉及到更改电脑设置 ...

  8. 嵌入式linux开启无线热点模式(AP),联机设备通过 wifi 热点访问外网

    嵌入式linux开启无线热点模式(AP),联机设备通过 wifi 热点访问外网. 一.内核和文件系统. 1.确认已移植好了hostapd. 2.确认文件系统中已移植好了iptables. iptabl ...

  9. Android 9.0 默认开启WLAN热点设置默认热点名称和密码

    1.概述 在android 9.0的系统产品开发中,在项目产品需求中,对于wifi和默认热点的使用也是常有的功能,在最近的项目开发中,需要开启WLAN热点,然后设置WLAN的默认热点 的名称和密码功能 ...

最新文章

  1. 10只机器狗拉卡车!井然有序,毫不费力 | 极客头条
  2. ​​​​​​​DL之RNN/LSTM/GRU:RNN/LSTM/GRU算法动图对比、TF代码定义之详细攻略
  3. tensorflow2.x版本无法调用gpu的一种解决方法
  4. 七十六、 数据结构二叉树及其代码实现
  5. python list 查找find_List 泛型 集合中 Find 的用法
  6. QT-Creator+SDK+编译器+自定义配置
  7. R作图-----北京市2017年一季度AQI指数日历热图
  8. linux设置基础软件仓库时,安装centos系统时设置基础软件仓库出错
  9. 数据层优化-jdbc连接池简述、druid简介
  10. 如何避免向下传递回调?
  11. MySQL数据库操作指令
  12. JAVA课程设计(小游戏贪吃蛇)完整源码附素材(三)
  13. python 安装包时出现:SyntaxError: invalid syntax
  14. X230 安装 EI Capitan 10.11.5 驱动篇
  15. 扫描二维码 扫码打电话 可以打电话的二维码
  16. Revit模型如何在网页上显示
  17. QT中实现二维码图片生成
  18. html背景图片不重叠铺满,html中背景图片铺满页面没有重复的效果
  19. 原生ajax传值php,原生ajax上传图片,php后台处理总结
  20. JPEG2000图像压缩算法学习

热门文章

  1. 苹果发新广告 借天文学家之口暗讽特朗普退巴协定
  2. 微信公众号第三方代理平台开发
  3. 先给大家推荐几个电子书的网站,自己看书去(zt)
  4. 最近看书少了,以后要多看书
  5. Spring AOP Pointcut
  6. linux中的硬件抽象层
  7. win10 个性化界面设置
  8. 利用webpack简单搭建 .vue环境
  9. Cookie和Session详解
  10. glid加载图片到background