Ich aktualisiere meine App für die Verwendung von iOS 7 und habe ein Problem mit der Tabellenansicht. Meine Tab-Leiste ist durchscheinend. Das Problem ist, wenn ich zum Ende meiner Tabellenansicht scrolle, befindet sich ein Teil der letzten Zelle immer noch hinter der Registerkartenleiste. Ich hätte gerne etwas Abstand zwischen der letzten Zelle und der Tab-Leiste. Ich könnte das Problem beheben, indem Sie stattdessen eine undurchsichtige Tabulatorleiste verwenden, aber ich möchte, dass sie durchsichtig bleibt.
Versuchen Sie die Einstellung
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = NO;
self.automaticallyAdjustsScrollViewInsets = NO;
In der Tableview-Steuerung
Überprüfen Sie den Screenshot
Überprüfen Sie die untere Leiste und deaktivieren Sie die untere Leiste
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
fügen Sie dies in viewDidLoad
Ihrer tableViewController
ein:
self.edgesForExtendedLayout = UIRectEdge()
self.extendedLayoutIncludesOpaqueBars = false
self.automaticallyAdjustsScrollViewInsets = false
Das hat bei mir funktioniert. In Ihrem Custom 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;
}
Ich weiß nicht, ob ich die Lösung mag, aber sie funktioniert für mich.
Mit iOS 11 habe ich kein Problem, ich verwende einfach Folgendes in viewDidLoad()
:
self.collectionView.bottomAnchor.constraint(self.view.safeAreaLayoutGuide.bottomAnchor).isActive = true
Auf iOS 10 muss ich mich jedoch so hacken:
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
}
}
Es ist wirklich schwierig, das Problem ohne detaillierte Informationen oder tatsächliche Codes zu lösen. Ich habe in meinem Projekt eine ähnliche Ausgabe von tabview hinter UItabBar. Die hier angebotenen Lösungen funktionieren in meinem Fall nicht. Nachdem ich meine Codes untersucht hatte, fand ich eine Lösung für meinen Fall.
Hier ist eine kurze Erklärung meines Falls. Ich habe eine UItabBar in der Hauptansicht mit zwei Registerkarten. In einer Registerkartenansicht gibt es eine Tabellenansicht. Wenn der Benutzer auf eine Zeile tippt, wird mithilfe des Navigationscontrollers eine Detailansicht angezeigt. In der Detailansicht ist die Registerkartenleiste ausgeblendet, und unten wird eine Symbolleiste angezeigt.
Um die Symbolleiste wieder in den Vordergrund zu bringen und die Symbolleiste auszublenden, muss ich die Tab-Leiste und die Symbolleiste im Fall von viewWillAppear explizit anzeigen:
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
}
...
}
Ich stelle fest, dass die Sichtbarkeit des Balkens im Fall von viewWillAppear eingestellt ist. Zu diesem Zeitpunkt sind die Inhaltseinsätze der tableView oder der Bildlaufansicht bereits basierend auf keiner Leiste am unteren Rand festgelegt. Deshalb ist meine tableView hinter der unteren Leiste.
Die Lösung, die ich gefunden habe, besteht darin, die Inhaltseinsätze im Falle von viewDidAppear zurückzusetzen:
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
}
Das funktioniert für mich
override func viewDidLoad() {
self.edgesForExtendedLayout = UIRectEdge()
self.extendedLayoutIncludesOpaqueBars = false
}
Wenn eine Ansicht hinter einer UITabBar angezeigt wird, können Sie den bottomLayoutGuide verwenden und zur Laufzeit Anpassungen vornehmen. Was ich mache, ist ein BaseViewController, von dem alle meine View-Controller erben. Wenn die Registerkartenleiste sichtbar ist, passen wir die Ansicht folgendermaßen an:
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)
}
}
}
Da ich keine Storyboards verwende (wo Sie ein Kontrollkästchen in IB anklicken können, um dieses Problem zu beheben), war dies die beste Lösung, die ich gefunden habe.