web-dev-qa-db-fra.com

TableView montrant derrière la barre d'onglets

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.

enter image description here

23
raginggoat

Essayez de mettre

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

À l'intérieur du contrôleur de table

39
Johnykutty

Vérifiez la capture d'écran

enter image description here

Vérifiez la barre inférieure et décochez la barre inférieure

16
CoolMonster

Swift 4.x

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

Swift 3

mettez ceci dans viewDidLoad de votre tableViewController:

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

Swift 3.0

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;
}
6
kemicofa

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
    }
 }
0
Manu

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
}
0
David.Chu.ca

Cela fonctionne pour moi

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

0
Sreeraj VR

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.

0
Spentak