最近一个项目遇到个要求:
上一个控制器状态栏显示、下一个控制器状态栏需要隐藏;
一开始觉得很简单,只不过是简单几行代码就是了:
在第二个控制器实现以下方法:
#pragma mark - 隐藏状态栏
- (BOOL)prefersStatusBarHidden {
return YES;
}于是乎,在有导航栏的情况下,出现以下情况:
当push第二个控制器的时候,状态栏突兀消失,并且,导航栏向上移动20个单位;
pop回到第二个控制器的时候,也出现用户体验不好的现象;
解决方法:
1.设立一个属性
/** 是否隐藏状态栏 */
@property(nonatomic, assign)BOOL hiddenStatusBar;- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
self.hiddenStatusBar = !self.hiddenStatusBar;
}- (void)setHiddenStatusBar:(BOOL)hiddenStatusBar {
_hiddenStatusBar = hiddenStatusBar;
// KVO获取statusBar
UIView *statusBar = [[UIApplication sharedApplication] valueForKey:@"statusBar"];
// 获取statubar原来Frame
CGRect originalFrame = statusBar.frame;
// 高度
CGFloat statusBarHeight = originalFrame.size.height;
if (self.hiddenStatusBar) {
[UIView animateWithDuration:0.25 animations:^{
CGFloat newY = -originalFrame.size.height;
CGRect newFrame = CGRectMake(originalFrame.origin.x, newY, originalFrame.size.width, statusBarHeight);
statusBar.frame = newFrame;
}];
} else {
[UIView animateWithDuration:0.25 animations:^{
CGFloat newY = 0;
CGRect newFrame = CGRectMake(originalFrame.origin.x, newY, originalFrame.size.width, statusBarHeight);
statusBar.frame = newFrame;
}];
}}
最终实现效果: