TabBar隐藏时偶尔出现黑色视图及滚动控制其显隐的实现疑问
解决TabBar隐藏后位置出现黑色视图的问题
首先咱们先优化滚动方向的判断逻辑——你当前用panGestureRecognizer.translation来判断方向,这个会在滚动过程中反复触发(比如手势拖动时translation会实时变化),容易导致TabBar频繁闪显闪藏,体验很不流畅。咱们改用滚动偏移量的差值来判断真实的滚动方向:
// 先定义一个变量记录上次滚动的偏移量 private var lastScrollOffset: CGFloat = 0 override func scrollViewDidScroll(_ scrollView: UIScrollView) { let currentOffset = scrollView.contentOffset.y let isScrollingDown = currentOffset > lastScrollOffset // 加个小阈值,避免微小滚动就触发TabBar的显示/隐藏 let scrollThreshold: CGFloat = 10 if abs(currentOffset - lastScrollOffset) > scrollThreshold { if isScrollingDown { // 内容向上滚动(手指向下滑),隐藏TabBar changeTabBar(hidden: true, animated: true) } else { // 内容向下滚动(手指向上滑),显示TabBar changeTabBar(hidden: false, animated: true) } } lastScrollOffset = currentOffset }
接下来解决黑色视图的核心问题:这通常是因为TabBar隐藏后,当前ViewController的view没有填充原本TabBar占据的空间,或者ScrollView的内边距没同步调整。咱们补全changeTabBar方法的逻辑,同时处理视图布局的适配:
func changeTabBar(hidden: Bool, animated: Bool) { guard let tabBar = self.tabBarController?.tabBar else { return } let tabBarHeight = tabBar.frame.height // 计算TabBar需要平移的距离 let offsetY = hidden ? tabBarHeight : -tabBarHeight UIView.animate(withDuration: animated ? 0.3 : 0) { // 平移TabBar实现显示/隐藏 tabBar.transform = CGAffineTransform(translationX: 0, y: offsetY) // 调整当前VC的view的frame,填充TabBar隐藏后的空间 if let tabBarVC = self.tabBarController { self.view.frame = hidden ? tabBarVC.view.bounds : CGRect( x: 0, y: 0, width: tabBarVC.view.bounds.width, height: tabBarVC.view.bounds.height - tabBarHeight ) // 同步调整TableView的内边距,避免底部内容被TabBar遮挡(显示时)或留白(隐藏时) if let tableView = scrollView as? UITableView { tableView.contentInset.bottom = hidden ? 0 : tabBarHeight tableView.scrollIndicatorInsets.bottom = hidden ? 0 : tabBarHeight } } // 可选:调整TabBar的透明度,让过渡更自然 tabBar.alpha = hidden ? 0 : 1 } }
最后还有两个关键的细节要注意:
- 在
viewDidLoad里设置视图延伸属性,确保VC的view能覆盖到TabBar区域:edgesForExtendedLayout = .all extendedLayoutIncludesOpaqueBars = true - 如果你的TabBar是不透明样式,隐藏时可以临时把它的背景色改成和当前VC的view背景色一致,彻底避免黑色块出现。
这样调整后,TabBar的显示/隐藏逻辑会更稳定,同时原本的黑色区域会被当前VC的视图填充,问题就能解决了。
内容的提问来源于stack exchange,提问作者Mohamed Lee
相关产品推荐
相关产品推荐

