今天在自己的应用中发现了一个问题。
实现场景:
1,当前页面中隐藏了系统的statusBar,比如在阅读页面就需要全界面形式的阅读体验
[[UIApplication sharedApplication] setStatusBarHidden:YES];
2,按住home键退出应用,应用挂起在后台
3,接收到推送提醒,点击推送提醒,唤起应用
4,应用里显示推送消息是在statusBar上显示的,所以把隐藏的statusBar先设置成不隐藏
[[UIApplication sharedApplication] setStatusBarHidden:NO];
5,然后自己实现具体的显示效果
在第四步中就出现了问题,当应用从后台唤醒的时候如果把原来隐藏着的statusBar设置成不隐藏,会导致当前页面的bounds大小产生变化,会发生视图向下移的情况,就是statusBar把当前视图给顶下去了。
起初想出来的解决方法是寻找视图大小改变时的切入点,把试图大小修正过来,但是一直没有成功。
但是有一个情况一直没有太注意,就是应用没有退到后台,而处于正在用的状态的时候如果设置statusBar显示出来就跟预想到的一样,会在当前视图上面以浮层的方式显示出来,也就是不会导致当前视图产生位移。
最后解决方案同样是从这里入手,应用从后台唤醒的时候先不设置statusBar的状态,而是延后设置,这样就不会导致statusBar的状态变化跟当前视图的显示同时进行,避免当前视图产生位移,如下代码:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary*)userInfo
{
NSDictionary *apsdic = [userInfo objectForKey:@"aps"];
NSString *alertStr = [apsdic objectForKey:@"alert"];
[self performSelector:@selector(showRemoteNotification:) withObject:alertStr afterDelay:1.0f];
}
- (void)showRemoteNotification:(NSString*)alertStr
{
[[UIApplication sharedApplication] setStatusBarHidden:NO];
self.statusBar = [[CustomStatusBar alloc] init];
[statusBar showStatusMessage:alertStr];
[statusBar hide:YESafterDelay:4.0f];
}
结论:这个问题按最后解决的方法来看是一个非常容易解决的问题,只不过误入歧途,耗了大半天,饶了一大圈才找到正确的解决方法。有时候问题想的过于复杂了。