iOS中,导航栏默认是可以侧滑,但是自定义导航之后,侧滑返回失效。
解决办法:在自定义导航栏中增加侧滑手势判断,代码如下:
- (void)viewDidLoad {
[super viewDidLoad];
// 重置侧滑手势的代理
__weaktypeof(self) weakSelf = self;
if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.interactivePopGestureRecognizer.delegate = (id)weakSelf;
}
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer*)gestureRecognizer {
// 判断是否是侧滑相关的手势
if(gestureRecognizer == self.interactivePopGestureRecognizer) {
// 如果当前展示的控制器是根控制器就不让其响应
if (self.viewControllers.count < 2 ||
self.visibleViewController == [self.viewControllers objectAtIndex:0]) {
returnNO;
}
// 如果个别页面不需要或者不能侧滑反,只要在这个方法返回NO就可以。代码如下:
if ([self.topViewController isKindOfClass:[YourCustomViewController class]]) {
returnNO;
}
}
return YES;
}
// 接收到多个手势的代理方法
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
// 判断是否是侧滑相关手势
if (gestureRecognizer == self.interactivePopGestureRecognizer&& [gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)gestureRecognizer;
CGPoint point = [pan translationInView:self.view];
// 判断手势的方向是侧滑的方向(向右)让多个手势共存
if (point.x > 0) {
returnYES;
}
}
return NO;
}
相信很多项目的导航栏都是自定义的,而且状态栏(电池栏)的模式也是根据页面的显示不同的样式,即设置:VC的:UIStatusBarStyle
ios13之前有2种:UIStatusBarStyleDefault 、UIStatusBarStyleLightContent
ios 13之后新增:UIStatusBarStyleDarkContent
注意:升级到iOS 13 之后;为了适配夜间模式,要把UIStatusBarStyleDefault 改为UIStatusBarStyleDarkContent
如果VC是模态出来的,直接重写preferredStatusBarStyle、prefersStatusBarHidden两个方法就可以。
代码如下:
//状态栏的前景色
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}
// 状态栏是否隐藏
- (BOOL)prefersStatusBarHidden {
return NO;
}
问题来了:如果有导航栏,发现这两个方法不被调用
问题分析:
1:模态出来的ViewController 没有导航栏,ViewController重写以上2个方法,2个方法都会被调用,因此该怎么设置就怎么设置
2:导航栏push出来的ViewController,没有调用以上2个方法,是因为系统调用了导航栏NavigationController的preferredStatusBarStyle,因此不调用当前ViewController的preferredStatusBarStyle方法;
解决办法:既然问题已经定位到,要解决也很简单,就是让系统不调用NavigationController的preferredStatusBarStyle,而是调用导航栏栈顶ViewController的preferredStatusBarStyle;这样就能做到每个ViewController单独控制自己的状态栏的显示样式
代码如下:
- (UIViewController *)childViewControllerForStatusBarStyle {
// visibleViewController 当前显示的ViewController
// topViewController 导航栏栈顶的ViewController
return self.topViewController;
}
- (UIViewController *)childViewControllerForStatusBarHidden {
return self.topViewController;
}
网友评论