【发布时间】:2014-01-19 23:39:11
【问题描述】:
我正在更新我的应用程序以使用 iOS 7,但我遇到了表格视图问题。我的标签栏是半透明的。问题是当我滚动到表格视图的底部时,最后一个单元格的一部分仍在标签栏后面。我想在最后一个单元格和标签栏之间留一点空间。我可以改用不透明的标签栏来解决这个问题,但我想让它保持半透明。
【问题讨论】:
标签: ios objective-c uitableview ios7 uitabbar
我正在更新我的应用程序以使用 iOS 7,但我遇到了表格视图问题。我的标签栏是半透明的。问题是当我滚动到表格视图的底部时,最后一个单元格的一部分仍在标签栏后面。我想在最后一个单元格和标签栏之间留一点空间。我可以改用不透明的标签栏来解决这个问题,但我想让它保持半透明。
【问题讨论】:
标签: ios objective-c uitableview ios7 uitabbar
尝试设置
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = NO;
self.automaticallyAdjustsScrollViewInsets = NO;
tableview 控制器内部
【讨论】:
Swift 4.x
let adjustForTabbarInsets: UIEdgeInsets = UIEdgeInsetsMake(0, 0, self.tabBarController!.tabBar.frame.height, 0)
self.yourTableView.contentInset = adjustForTabbarInsets
self.yourTableView.scrollIndicatorInsets = adjustForTabbarInsets
【讨论】:
查看屏幕截图
选中底部栏下方并取消选中底部栏
【讨论】:
SWIFT 3
把这个放在viewDidLoad 的tableViewController 中:
self.edgesForExtendedLayout = UIRectEdge()
self.extendedLayoutIncludesOpaqueBars = false
self.automaticallyAdjustsScrollViewInsets = false
【讨论】:
这对我有用。在您的自定义 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);
不确定我是否喜欢这个解决方案,但它对我有用。
使用 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
}
...
}
我终于意识到底部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
}
【讨论】:
最好的方法是嵌入 TabBarController 到您的 ViewController(编辑器 -> 嵌入 -> TabBar 控制器)并将表格视图的底部设置为 安全区域的底部视图控制器的强>。其他方式不会像这个一样完美。
【讨论】:
您需要调整表格视图的高度。只需在底部保留 49 像素,因为标签栏高度为 49 像素。调整表格视图的高度,使其下方留出 49px 的空间。
【讨论】: