【问题标题】:TableView Showing Behind Tab Bar显示在标签栏后面的 TableView
【发布时间】:2014-01-19 23:39:11
【问题描述】:

我正在更新我的应用程序以使用 iOS 7,但我遇到了表格视图问题。我的标签栏是半透明的。问题是当我滚动到表格视图的底部时,最后一个单元格的一部分仍在标签栏后面。我想在最后一个单元格和标签栏之间留一点空间。我可以改用不透明的标签栏来解决这个问题,但我想让它保持半透明。

【问题讨论】:

标签: ios objective-c uitableview ios7 uitabbar


【解决方案1】:

尝试设置

self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = NO;
self.automaticallyAdjustsScrollViewInsets = NO;

tableview 控制器内部

【讨论】:

  • 是的,它可以工作,但我的 tabBar 突然变色了。
  • 你能分辨出从哪个颜色变成哪个颜色的颜色变化吗?
  • 首先是白色的,然后变成了一些带有渐变的灰色。但是手动更改为白色后,一切都很好。只是想知道为什么会这样。
  • 不行,最后一个单元格还在标签栏后面。
【解决方案2】:

Swift 4.x

let adjustForTabbarInsets: UIEdgeInsets = UIEdgeInsetsMake(0, 0, self.tabBarController!.tabBar.frame.height, 0)
self.yourTableView.contentInset = adjustForTabbarInsets
self.yourTableView.scrollIndicatorInsets = adjustForTabbarInsets

【讨论】:

  • 在 iOS 11(iPhone 7 和 iPhone X)上运行良好,在 iOS 10 上无法运行
  • 感谢@Hemang,为我工作,但是当我按下导航栏搜索栏时,我遇到了另一个问题,它为我提供了导航栏和表格视图之间的空间。如果您对此有任何解决方案,请更新我。干得好
【解决方案3】:

查看屏幕截图

选中底部栏下方并取消选中底部栏

【讨论】:

  • 如何以编程方式取消选中它?我不能以编程方式做到这一点
【解决方案4】:

SWIFT 3

把这个放在viewDidLoadtableViewController 中:

self.edgesForExtendedLayout = UIRectEdge()
self.extendedLayoutIncludesOpaqueBars = false
self.automaticallyAdjustsScrollViewInsets = false

【讨论】:

    【解决方案5】:

    斯威夫特 3.0

    这对我有用。在您的自定义 ViewController 中:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        let adjustForTabbarInsets: UIEdgeInsets = UIEdgeInsetsMake(self.tabBarController!.tabBar.frame.height, 0, 0, 0);
        //Where tableview is the IBOutlet for your storyboard tableview.
        self.tableView.contentInset = adjustForTabbarInsets;
        self.tableView.scrollIndicatorInsets = adjustForTabbarInsets;
    }
    

    【讨论】:

    • 边缘插图应该是底部,而不是顶部:let adjustForTabbarInsets: UIEdgeInsets = UIEdgeInsetsMake(0, 0, self.tabBarController!.tabBar.frame.height, 0);
    【解决方案6】:

    不确定我是否喜欢这个解决方案,但它对我有用。

    使用 iOS 11 我没有问题,我只需在 viewDidLoad() 中使用以下内容:

    self.collectionView.bottomAnchor.constraint(self.view.safeAreaLayoutGuide.bottomAnchor).isActive = true
    

    但是在 iOS 10 上,我需要像这样破解自己的方式:

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        let tabBarHeight: CGFloat = (self.parent?.tabBarController?.tabBar.frame.size.height)!
    
        if #available(iOS 11.0, *) {
    
        } else {
            self.collectionView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -tabBarHeight).isActive = true
        }
     }
    

    【讨论】:

      【解决方案7】:

      这对我有用

      override func viewDidLoad() { self.edgesForExtendedLayout = UIRectEdge() self.extendedLayoutIncludesOpaqueBars = false }

      【讨论】:

        【解决方案8】:

        如果有任何视图显示在 UITabBar 后面,您可以抓取 bottomLayoutGuide 并在运行时进行调整。我所做的是拥有一个 BaseViewController,我的所有视图控制器都继承自它。然后如果标签栏可见,我们调整视图如下:

        import UIKit
        
        class BaseVC: UIViewController {
        
        override func viewDidLoad() {
            super.viewDidLoad()
        }
        
        override func viewDidLayoutSubviews() {
            //Ensures that views are not underneath the tab bar
            if tabBarController?.tabBar.hidden == false {
                var viewBounds = self.view.bounds;
                var bottomBarOffset = self.bottomLayoutGuide.length;
                self.view.frame = CGRectMake(0, 0, viewBounds.width, viewBounds.height - bottomBarOffset)
            }
          }
        }
        

        由于我不使用情节提要(您可以单击 IB 中的复选框来解决此问题),因此这是我找到的最佳解决方案。

        【讨论】:

          【解决方案9】:

          如果没有详细信息或实际代码,确实很难解决问题。我的项目中 UItabBar 后面有类似的 tabview 问题。此处提供的解决方案不适用于我的情况。在探索了我的代码后,我找到了适合我的案例的解决方案。

          这是我的案例的简要说明。我在主视图中有一个带有两个选项卡按钮的 UItabBar。在一个选项卡视图中,有一个表格视图。如果用户点击一行,则使用导航控制器呈现详细视图。在详细视图中,标签栏被隐藏,底部显示一个工具栏。

          为了在带回主视图时带回标签栏并隐藏工具栏,我必须在 viewWillAppear 事件中显式显示标签栏和隐藏工具栏:

          class myMainViewController: UITableViewController {
            private var tabBarHidden: Bool? = {
              didSet {
                self.tabBarController?.tabBar.isHidden = tabBarIsHidden ?? true
              }
            }
          
            private var toolBarIsHidden: Bool? {
              didSet {
                let hidden = toolBarIsHidden ?? true
                  self.navigationController?.toolbar.isHidden = hidden
                  self.navigationController?.setToolbarHidden(hidden, animated: true)
                }
            }
            ...
            override func viewWillAppear(_ animated: Bool) {
              super.viewWillAppear(animated)
          
              self.tabBarIsHidden = false
              self.toolBarIsHidden = true
            }
            ...
          }
          

          我终于意识到底部bar的可见性是在viewWillAppear事件中设置的。那时,tableView 或滚动视图的内容 insets 已经基于底部没有 bar 设置。这就是为什么我的 tableView 在底栏后面。

          我找到的解决方案是在 viewDidAppear 事件中重置内容插入:

          override func viewDidAppear(_ animated: Bool) {
            // In the event of viewWillAppear, visibilities of tool bar and tab bar are set or changed,
            // The following codes resets scroll view's content insets for tableview
            let topInset = self.navigationController!.navigationBar.frame.origin.y +
              self.navigationController!.navigationBar.frame.height
            let adjustForTabbarInsets: UIEdgeInsets = UIEdgeInsetsMake(
                  topInset, 0,
                  self.tabBarController!.tabBar.frame.height, 0)
            self.tableView.contentInset = adjustForTabbarInsets
            self.tableView.scrollIndicatorInsets = adjustForTabbarInsets
          }
          

          【讨论】:

            【解决方案10】:

            最好的方法是嵌入 TabBarController 到您的 ViewController(编辑器 -> 嵌入 -> TabBar 控制器)并将表格视图的底部设置为 安全区域的底部视图控制器的强>。其他方式不会像这个一样完美。

            【讨论】:

              【解决方案11】:

              您需要调整表格视图的高度。只需在底部保留 49 像素,因为标签栏高度为 49 像素。调整表格视图的高度,使其下方留出 49px 的空间。

              【讨论】:

                猜你喜欢
                • 2018-05-24
                • 1970-01-01
                • 1970-01-01
                • 2020-08-31
                • 1970-01-01
                • 1970-01-01
                • 2018-01-20
                • 1970-01-01
                • 2017-08-14
                相关资源
                最近更新 更多