iOS动画隐藏状态栏

914 阅读1分钟

最近一个项目遇到个要求:

上一个控制器状态栏显示、下一个控制器状态栏需要隐藏;

一开始觉得很简单,只不过是简单几行代码就是了:

在第二个控制器实现以下方法:

#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;
        }];
    }}

最终实现效果: