iPhone/iOS开启个人热点的相关位置调整小结

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

    关于热点的帖子网上确实不少,也给了很多的解决的方案。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 加上上面的处理,和通知里面的代码是一样的,两个都是必须的,这样的话经过反复测试确实效果还是不错的,今天就说到这里吧先,思路终于清晰了也。

时间: 2024-10-22 00:19:02

iPhone/iOS开启个人热点的相关位置调整小结的相关文章

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

一.iPhone创建个人热点 iPhone/iOS双环上网,即iPhone通过创建个人热点(Personal Hotspot)实现共享上网,支持便携式Wi-Fi热点.蓝牙共享网络和USB共享网络. 1.若iPhone已开启了WiFi(和蓝牙),则直接创建成功. 其他设备可通过WiFi(或蓝牙)搜索热点名称并连接实现共享上网. 需要说明的是:苹果的蓝牙协议是封闭的,只支持苹果的设备(iPhone/iPad/iMac)间连接,无法与Android等设备的蓝牙进行发现配对! 2.若iPhone只开启了

iphone ios 如何使用gcd,block

iphone ios 如何使用gcd,block 转自:http://blog.sina.com.cn/s/blog_45e2b66c01010dhd.html 1.GCD之dispatch queue http://www.cnblogs.com/scorpiozj/archive/2011/07/25/2116459.html 2.iOS中GCD的魔力 http://blog.csdn.net/favormm/article/details/6453260 3.官方 ,内容真的很多 http

iOS Foundation 框架 224 篇相关文档分类整理

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 截至 2014-05-02 ,苹果官网 Foundation 框架相关文档共计 224 篇,分类如下: Foundation 框架概述文档:常量.

通过电脑系统开启无线热点

通过电脑系统开启无线热点·教程 现在,无线网络已成为我们惯用的上网手段,因为其方便快捷.当我们只有一台计算机能够联网时,我们会采取开启无线热点的方式,以便于更多的人能够连接网络得以上网.我们所熟悉的开启热点的方式有很多,比如在腾讯电脑管家里免费开启热点,使用360随身wifi等手段.那么不用借助这些软件,只依靠操作系统能否解决开启无线热点的问题呢? 接下来,我们就以Win7为例,给大家演示一下. 首先,为了验证无线热点的开启,我们先查看网络共享中心中的适配器,如下图所示: 接下来,我们打开运行窗

IOS上 关于状态栏的相关设置(UIStatusBar)

转:http://my.oschina.net/shede333/blog/304560#OSC_h3_8 IOS上 关于状态栏的相关设置(UIStatusBar) 知识普及 ios上状态栏 就是指的最上面的20像素高的部分 状态栏分前后两部分,要分清这两个概念,后面会用到: 前景部分:就是指的显示电池.时间等部分: 背景部分:就是显示黑色或者图片的背景部分: 如下图:前景部分为白色,背景部分为黑色  注意:这里只涉及到ios7以及更高版本,低版本下面的讲解可能无效. 设置statusBar的[

ios 开启线程定时请求某个方法

- (void)startLoop { [NSThread detachNewThreadSelector:@selector(loopMethod) toTarget:self withObject:nil]; } - (void)loopMethod { [NSTimer scheduledTimerWithTimeInterval:3.0f target:self selector:@selector(requestIsHaveReview) userInfo:nil repeats:YE

怎样在Win7系统建立并开启Wifi热点

http://jingyan.baidu.com/article/48a42057a03cf7a9242504d0.html还在担心手机卡流量太少了吗?不妨试试在Win7系统下建立并开启WiFi热点,有了WiFi,你就可以畅玩支持WiFi的移动设备了. 工具/原料 笔记本(Win7系统) WiFi设备 步骤/方法 1 首先,确定你的笔记本已经开启了无线. 点击电脑左下角的开始,在搜索程序和文件栏输入cmd. 2 在上图中找到Windows命令处理程序cmd.exe,右击选择以管理员身份运行. 3

IOS 开启定位功能 CLLocationManager 介绍-简单使用

iOS 中的定位功能,主要在 CoreLocation库中,需要用到位置管理器 CLLocationManager 来完成绝大多数事情. 要使用 CLLocationManager 首先需要一个对象~ 以及对它进行简单的设置,最后开启定位功能, 就开始定位了,定位成功或者失败后都会调用代理方法返回信息 1 CLLocationManager *manger; 2 3 manger = [[CLLocationManager alloc] init]; //初始化 4 5 manger.deleg

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

IQKeyboardManager Github地址 经常在开发一个应用程序,我们遇到了一个问题,iPhone的键盘上滑覆盖的UITextField / UITextView.IQKeyboardManager可以防止键盘滑动问题和覆盖UITextField / UITextView无需你输入任何代码,不需要额外的设置要求.使用IQKeyboardManager你只需要添加源文件到你的项目. 主要特点 1)无代码 2)自动工作 3)没有更多的UIScrollView4)没有更多的子类 5)没有更