显示在标签栏后面的TableView
我正在更新我的应用程序使用iOS 7,我有一个表视图的问题。 我的标签栏是半透明的。 问题是当我滚动到我的表视图的底部,最后一个单元格的一部分仍然在标签栏后面。 我想在最后一个单元格和标签栏之间留出一点空间。 我可以通过使用一个不透明的标签栏来解决这个问题,但是我想保持它半透明。
尝试设置
self.edgesForExtendedLayout = UIRectEdgeNone; self.extendedLayoutIncludesOpaqueBars = NO; self.automaticallyAdjustsScrollViewInsets = NO;
在tableview控制器里面
检查屏幕截图
检查底部酒吧底下的酒吧和取消支票
Swift 3.0
这是为我工作。 在你的自定义视图控制器中:
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; }
SWIFT 3
把它放在你的tableViewController
viewDidLoad
里面:
self.edgesForExtendedLayout = UIRectEdge() self.extendedLayoutIncludesOpaqueBars = false self.automaticallyAdjustsScrollViewInsets = false
Swift 4.x
let adjustForTabbarInsets: UIEdgeInsets = UIEdgeInsetsMake(0, 0, self.tabBarController!.tabBar.frame.height, 0) self.yourTableView.contentInset = adjustForTabbarInsets self.yourTableView.scrollIndicatorInsets = adjustForTabbarInsets
如果在UITabBar后面显示任何视图,则可以抓取bottomLayoutGuide并在运行时进行调整。 我所做的是有一个BaseViewController,所有我的视图控制器inheritance。 然后,如果标签栏是可见的,我们调整视图像这样:
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中点击checkbox来解决这个问题),这是我find的最好的解决scheme。
没有详细信息或实际的代码就很难解决问题。 在我的项目中,我有类似的UItabBar背后的tabview问题。 这里提供的解决scheme不适用于我的情况。 在探索我的代码后,我find了一个解决scheme。
这里是我的情况的简要解释。 我有一个UItabBar在主视图中有两个选项卡button。 在一个选项卡视图中,有表格视图。 如果用户点击一行,则使用导航控制器来呈现详细视图。 在详细视图中,标签栏是隐藏的,工具栏显示在底部。
为了使标签栏回来并隐藏工具栏,当主视图被带回时,我必须在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或scroll view的内容插件已经根据底部的没有栏设置了。 这就是为什么我的tableView是在底部栏之后。
我发现的解决scheme是在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 }
对于那些将使用@ Spentak解决scheme的人来说,这个代码在iOS版本11.x之后陷入了一个无限循环,因为下面这一行;
self.view.frame = CGRectMake(0,0,viewBounds.width,viewBounds.height – bottomBarOffset)
此行一次又一次触发viewDidLayoutSubviews()。 小心这个。
您需要调整表视图的高度。 只需在底部保留49px,因为tabbar的高度是49px。 调整表视图的高度,使其下面留下49px的空间。