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

    关于热点的帖子网上确实不少,也给了很多的解决的方案。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. 怎样在Win7系统建立并开启Wifi热点

    怎样在Win7系统建立并开启Wifi热点 步骤/方法: 1.首先,确定你的笔记本已经开启了无线. 点击电脑左下角的开始,在搜索程序和文件栏输入cmd. 2.在上图中找到Windows命令处理程序cmd ...

  2. Linux/Ubuntu 16.04 使用校园网客户端Dr.com DrClient 有线连网,同时开启WiFi热点

    前面写过Ubuntu 16.04 使用校园网客户端 DrClient 无线上网,在这篇文章中将要介绍下,在Ubuntu 16.04上如何使用校园网客户端实现有线登录,这个问题也让博主困惑了很久,但是问 ...

  3. Win10 开启移动热点 WiFi 的简单方法

    原文地址:https://blog.csdn.net/u012318074/article/details/77162475 Win 10 开启移动热点 WiFi 的方法很简单,并不需要像网上那样还要 ...

  4. iPhone电话与短信相关代码小结

    关于iPhone上电话与短信相关功能,做一个简单总结: 使用公开SDK能实现的功能: (1)获取和操作通讯录.使用函数 ABAddressBookRequestAccessWithCompletion ...

  5. 排坑&#183;IPhone&IOS中不兼容正则中的断言匹配

    阅文时长 | 1.14分钟 字数统计 | 1834.4字符 主要内容 | 1.问题切入 2.什么是断言匹配 3.断言匹配的替换方案 4.声明与参考资料 『排坑·IPhone&IOS中不兼容正则 ...

  6. Win10开启移动热点

    Win10开启移动热点 禁用 无线网卡 启动 无线网卡

  7. iOS 键盘自适应(IQKeyboardManager)使用小结

    IQKeyboardManager Github地址 经常在开发一个应用程序,我们遇到了一个问题,iPhone的键盘上滑覆盖的UITextField / UITextView.IQKeyboardMa ...

  8. iPhone/iOS图片相关(读取、保存、绘制、其它相关)

    http://blog.csdn.net/jerryvon/article/details/7526147 20:50:42 一.读取图片 1.从资源(resource)读取 UIImage* ima ...

  9. iOS开发 判断用户是否开启了热点

    - (BOOL)achiveUserHotspotOpening { return [UIApplication sharedApplication].statusBarFrame.size.heig ...

随机推荐

  1. altium designer使用小技巧,记录

    1.在自建库文件中添加component File--open----schlib或pcblib---Tools---new component---绘制---保存. 2.编辑component 左边 ...

  2. [C#.NET 拾遗补漏]10:理解 volatile 关键字

    要理解 C# 中的 volatile 关键字,就要先知道编译器背后的一个基本优化原理.比如对于下面这段代码: public class Example { public int x; public v ...

  3. python自动化测试,读取excal数据报"'str' object has no attribute 'items'"问题解决

    通过python进行自动化测试,为了方便,对代码和数据进行了分离,此处把测试数据放到了excal表格中.requests.post请求时报"'str' object has no attri ...

  4. 关于LoRa安全联盟的六大常见问题

    LoRaWAN的安全机制在哪里指定? 所有安全机制都在LULA联盟规范中指定,可以由公众下载. LoRa联盟规范如何保证LoRaWAN网络的安全操作? LoRaWAN支持来源认证.完整的媒体访问控制( ...

  5. 循序渐进VUE+Element 前端应用开发(25)--- 各种界面组件的使用(1)

    在我们使用Vue+Element开发前端的时候,往往涉及到很多界面组件的使用,其中很多直接采用Element官方的案例即可,有些则是在这个基础上封装更好利用.更少代码的组件:另外有些则是直接采用第三方 ...

  6. Git clone 克隆Github上的仓库,速度慢?

    一. 终端输入: git config --global http.postBuffer 524288000 二. git替换https 三. windows 安装 https://motrix.ap ...

  7. 微信小程序开发之云开发

    创建云开发小程序项目 开通云开发 开通后界面 选择开发环境 开启使用npm模块 安装wx-server-sdk npm install --save wx-server-sdk@latest 创建云函 ...

  8. 12装饰器及*args,**kwargs

    注:参数和返回值都是一个函数. 1,无参数 def decotare1(func): def wrapper(): print("First") func() return wra ...

  9. 类和对象在JVM中是如何存储的,竟然有一半人回答不上来!

    前言 这篇博客主要来说说类与对象在JVM中是如何存储的,由于JVM是个非常庞大的课题,所以我会把他分成很多章节来细细阐述,具体的数量还没有决定,当然这不重要,重点在于是否可以在文章中学到东西,是否对J ...

  10. sk_buff结构--转载

    套接字缓存之sk_buff结构 https://www.cnblogs.com/wanpengcoder/p/7529486.html 来此此处 sk_buff结构用来描述已接收或者待发送的数据报文信 ...