最近写了一个仿微信的图片查看效果.上方是一个自定义的导航栏和 statusBar 下方是一个 scrollerView的图片分页查看效果.点击图片时导航栏和 状态栏(statusBar)会一起动画向上隐藏 ,再次点击显示 .具体的流程 以及代码实现如下
1.首先我们要在 info.plist 文件中加入字段View controller-based status bar appearance 设置为 YES 原因在于 我们要在视图控制器中设置 statusBar的隐藏效果 默认的情况下 视图控制器对 statusBar 的优先级 是低于[UIApplication shareApplication]的
2.设置 statusBar 的隐藏样式 这个需要回调方法返回 具体 重写回调方法
-(UIStatusBarAnimation)preferredStatusBarUpdateAnimation{
return UIStatusBarAnimationSlide;
}
3重写statusBar 的是否隐藏的回调方法 这里我们用一个全局变量来控制
-(BOOL)prefersStatusBarHidden{
return _isHiden;
}
4在图片的触摸方法中 调用 statusBar 的状态效果 是隐藏 还是 显示,代码中的_top 是我自定义的导航栏,目的是 导航栏和 statusBar 一起隐藏
-(void)tapClick{
_isHiden=!_isHiden;
[UIView animateWithDuration:0.3 animations:^{
if (_isHiden) {
_top.transform=CGAffineTransformMakeTranslation(0, -64);
}else{
_top.transform=CGAffineTransformMakeTranslation(0, 0);
}
[self setNeedsStatusBarAppearanceUpdate];
}];
}
这样下来 看似完成了 ,但是还有一个大坑, 如下 未隐藏的时候的效果
黑色背景和图片之间的视图 为 scrollerView 我设置的零零点为(0.0)尺寸为屏幕大小 但是系统却在最下方 少显示了20高度的视图 图片设置的为 scrollerView 的(0.0)但是 显示的时候 却从(0.20)开始显示
隐藏后却又显示正常
并且在切换的过程中,因为系统要给它进行重新布局,所以会出现一个闪现的效果,实在烦人。最后的解决方法是 这个属性 self.automaticallyAdjustsScrollViewInsets=NO;
原因在于 视图控制器默认的 自身子视图的 scrollerView 会有一个调节作用 自动给 scrollerView 添加一个内边距,内边距的大小 取决于系统视图 在这里就体现在 statusBar ,隐藏后 因为没有了 statusBar 所以重复调节 出现闪现效果 只要设置为 NO 就一切正常啦