簡體   English   中英

TableView 顯示在標簽欄后面

[英]TableView Showing Behind Tab Bar

我正在更新我的應用程序以使用 iOS 7,但我在使用表格視圖時遇到了問題。 我的標簽欄是半透明的。 問題是當我滾動到表格視圖的底部時,最后一個單元格的一部分仍然在標簽欄后面。 我想在最后一個單元格和標簽欄之間留一點空間。 我可以通過使用不透明的標簽欄來解決這個問題,但我想讓它保持半透明。

在此處輸入圖片說明

嘗試設置

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

在 tableview 控制器內部

斯威夫特 4.x

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

檢查屏幕截圖

在此處輸入圖片說明

檢查下頂部欄和取消底部欄下的檢查

斯威夫特 3

把它放在你的tableViewController viewDidLoad中:

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

斯威夫特 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;
}

不確定我喜歡這個解決方案,但它對我有用。

使用 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
    }
 }

這對我有用

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

如果任何視圖顯示在 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 中的復選框來解決此問題),因此這是我找到的最佳解決方案。

如果沒有詳細信息或實際代碼,很難解決問題。 我的項目中 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
  }
  ...
}

我終於意識到底部欄的可見性是在 viewWillAppear 事件中設置的。 那時,tableView 或滾動視圖的內容插入已經基於底部沒有欄設置。 這就是為什么我的 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
}

最好的方法是將 TabBarController 嵌入到您的 ViewController(編輯器 -> 嵌入 -> TabBar 控制器)並將 tableview 的底部設置為 viewcontroller安全區域的底部。 其他方式不會像這種方式那么完美。

您需要調整表格視圖的高度。 只需在底部留下 49 像素,因為標簽欄高度為 49 像素。 調整 table view 的高度,使其下方留出 49px 的空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM