Je suis en train de mettre à jour mon application pour utiliser iOS 7 et je rencontre un problème avec une vue de table. Ma barre de tabulation est translucide. Le problème est que lorsque je fais défiler l'écran jusqu'en bas de la table, une partie de la dernière cellule est toujours derrière la barre d'onglets. Je voudrais avoir un peu d'espace entre la dernière cellule et la barre d'onglets. Je pourrais résoudre ce problème en utilisant une barre de tabulation opaque à la place, mais je veux le garder translucide.
Essayez de mettre
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = NO;
self.automaticallyAdjustsScrollViewInsets = NO;
À l'intérieur du contrôleur de table
Vérifiez la capture d'écran
Vérifiez la barre inférieure et décochez la barre inférieure
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
mettez ceci dans viewDidLoad
de votre tableViewController
:
self.edgesForExtendedLayout = UIRectEdge()
self.extendedLayoutIncludesOpaqueBars = false
self.automaticallyAdjustsScrollViewInsets = false
C'est ce qui a fonctionné pour moi. Dans votre ViewController personnalisé:
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;
}
Pas sûr que j'aime la solution mais ça marche pour moi.
Avec iOS 11, je n’ai aucun problème, j’utilise simplement les éléments suivants dans viewDidLoad()
:
self.collectionView.bottomAnchor.constraint(self.view.safeAreaLayoutGuide.bottomAnchor).isActive = true
Cependant, sur iOS 10, je dois me frayer un chemin comme ceci:
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
}
}
Il est vraiment difficile de résoudre le problème sans informations détaillées ou codes réels. J'ai un problème similaire de tabview derrière UItabBar dans mon projet. Les solutions proposées ici ne fonctionnent pas dans mon cas. Après avoir exploré mes codes, j'ai trouvé une solution à mon cas.
Voici une brève explication de mon cas. J'ai un UItabBar dans la vue principale avec deux boutons d'onglet. Dans un onglet, il y a un tableau. Si l'utilisateur appuie sur une ligne, une vue détaillée est présentée à l'aide du contrôleur de navigation. Dans la vue détaillée, la barre d’onglet est masquée et une barre d’outils apparaît en bas.
Afin de ramener la barre d'onglets et de masquer la barre d'outils lorsque la vue principale est rétablie, je dois montrer explicitement la barre d'onglets et la barre d'outils masquer en cas de 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
}
...
}
Je réalise enfin que la visibilité de la barre en bas est définie dans le cas de viewWillAppear. À ce moment-là, les encarts de contenu de la tableView ou de la vue de défilement sont déjà définis en fonction de l'absence de barre en bas. C'est pourquoi mon tableView est derrière la barre inférieure.
La solution que j'ai trouvée consiste à réinitialiser les encarts de contenu dans le cas de 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
}
Cela fonctionne pour moi
override func viewDidLoad() {
self.edgesForExtendedLayout = UIRectEdge()
self.extendedLayoutIncludesOpaqueBars = false
}
Si une vue apparaît derrière un UITabBar, vous pouvez récupérer le bottomLayoutGuide et effectuer des réglages au moment de l'exécution. Ce que je fais, c'est un BaseViewController dont tous mes contrôleurs de vue héritent. Ensuite, si la barre d’onglet est visible, nous ajustons la vue comme suit:
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)
}
}
}
Étant donné que je n’utilise pas de scénarimage (où vous pouvez cocher une case dans IB pour résoudre ce problème), c’est la meilleure solution que j’ai trouvée.