it-swarm.com.de

TableView zeigt hinter der Tab-Leiste

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.

enter image description here

23
raginggoat

Versuchen Sie die Einstellung

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

In der Tableview-Steuerung

39
Johnykutty

Überprüfen Sie den Screenshot

enter image description here

Überprüfen Sie die untere Leiste und deaktivieren Sie die untere Leiste

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

fügen Sie dies in viewDidLoad Ihrer tableViewController ein:

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

Swift 3.0

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

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

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

Das funktioniert für mich

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

0
Sreeraj VR

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.

0
Spentak