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

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

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

1.系统状态栏

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

// iOS系统版本

#defineSYSTEM_VERSION[[[UIDevice currentDevice] systemVersion] doubleValue]

// 标准系统状态栏高度

#defineSYS_STATUSBAR_HEIGHT20

// 热点栏高度

#defineHOTSPOT_STATUSBAR_HEIGHT20

// 导航栏(UINavigationController.UINavigationBar)高度

#defineNAVIGATIONBAR_HEIGHT44

// 工具栏(UINavigationController.UIToolbar)高度

#defineTOOLBAR_HEIGHT44

// 标签栏(UITabBarController.UITabBar)高度

#defineTABBAR_HEIGHT44

// APP_STATUSBAR_HEIGHT=SYS_STATUSBAR_HEIGHT+[HOTSPOT_STATUSBAR_HEIGHT]

#defineAPP_STATUSBAR_HEIGHT(CGRectGetHeight([UIApplication sharedApplication].statusBarFrame))

// 根据APP_STATUSBAR_HEIGHT判断是否存在热点栏

#defineIS_HOTSPOT_CONNECTED(APP_STATUSBAR_HEIGHT==(SYS_STATUSBAR_HEIGHT+HOTSPOT_STATUSBAR_HEIGHT)?YES:NO)

// 无热点栏时,标准系统状态栏高度+导航栏高度

#defineNORMAL_STATUS_AND_NAV_BAR_HEIGHT(SYS_STATUSBAR_HEIGHT+NAVIGATIONBAR_HEIGHT)

// 实时系统状态栏高度+导航栏高度,如有热点栏,其高度包含在APP_STATUSBAR_HEIGHT中。

#defineSTATUS_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 加上上面的处理,和通知里面的代码是一样的,两个都是必须的,这样的话经过反复测试确实效果还是不错的,今天就说到这里吧先,思路终于清晰了也。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容