iOS 导航栏透明化(存在navigationBar的情况下,而且translucent = no)?

在手势右滑返回的时候,navigationBar出现黑色区域。什么情况?
问题的出现具体如下:在首页是一个渐变透明化的导航栏,点击动作跳往第二个界面之后手势右滑返回慢慢返回(viewWillAppear)的时候上面的navigationBar没有保持原来的空白,出现了如下图的空白。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat minAlphaOffset = 0;
    CGFloat maxAlphaOffset = 200;
    CGFloat offset = scrollView.contentOffset.y;
    CGFloat alpha = (offset - minAlphaOffset) / (maxAlphaOffset - minAlphaOffset);
    // barImageView = self.navigationController.navigationBar.subviews.firstObject; navigationBar上的背景图层
    barImageView.alpha = alpha;
    // indexAlpha 变量记录首页navigationBar的透明度
    indexAlpha = alpha;
    [self setNeedsStatusBarAppearanceUpdate];
}
-(void)viewWillAppear:(BOOL)animated{
   self.navigationController.navigationBar.translucent = NO;
   //回到首页,导航栏保持离开时的透明度
   barImageView.alpha = indexAlpha;
}

-(void)viewWillDisappear:(BOOL)animated{
    //保证其他页面的透明度为1
    barImageView.alpha = 1;
}

clipboard.png

clipboard.png

阅读 7.7k
3 个回答

黑色部分是window的backgroundColor, 可以打开视图模式查看, 设置window的backgroundColor避免nav滑动navbar未出现时黑色背景

出现这种情况一般是window,或者是window.rootViewController(一般为Tabbarcontroller)的 backgroundColor 未设置。

你使用代理方法

  • (void)scrollViewDidScroll:(UIScrollView *)scrollView

好像 CGFloat maxAlphaOffset = 200 不合适, 应该等于 屏幕宽

通常我们实现类似的效果,是通过添加手势

@interface BaseNavigationController : UINavigationController

@end
@interface BaseNavigationController () <UIGestureRecognizerDelegate>

@property (nonatomic, strong) UIPanGestureRecognizer *popPanGesture;
@property (nonatomic, strong) id popGestureDelegate;

@end
@implementation BaseNavigationController
- (void)addFullScreenPopGestureAction
{
    self.popGestureDelegate = self.interactivePopGestureRecognizer.delegate;
    SEL action = NSSelectorFromString(@"handleNavigationTransition:");
    self.popPanGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self.popGestureDelegate action:action];
    self.popPanGesture.maximumNumberOfTouches = 1;
    self.popPanGesture.delegate = self;
    [self.view addGestureRecognizer: self.popPanGesture];
}
@end
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进