webentwicklung-frage-antwort-db.com.de

benutzerdefinierte TableView für iOS 7 befindet sich unter der TabBar

Ich versuche, meine App nach iOS7 zu portieren, aber meine benutzerdefinierte TableViewController zeigt die letzte Zeile (Zelle) unter der TabBar :(

Ich suche viel danach, aber ich finde keine Lösung. Kann mir jemand helfen?

Meine benutzerdefinierte Tabellensichtklasse

Der Fehler wird im Blow-Screenshot angezeigt (zeigt nur einen Teil des letzten Produkts, da das verborgene Produkt unter der Tab-Leiste angezeigt wird):

screenshot

Vielen Dank.

30
Paulo Coutinho

Ich habe die Antwort auf Ihre Frage in einem anderen Beitrag gefunden, die von Dariaa hier beantwortet wurde:

Tab-Leiste deckt TableView-Zellen in iOS7 ab

Es hat großartig für mich funktioniert.

Bitte keinen Kredit für mich, denn ich bin nicht der ursprüngliche Typ, der es gelöst hat.

Fügen Sie in Ihrem benutzerdefinierten TableViewController diese beiden Zeilen unter [super viewDidLoad] hinzu:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.edgesForExtendedLayout = UIRectEdgeAll;
    self.tableView.contentInset = UIEdgeInsetsMake(0., 0., CGRectGetHeight(self.tabBarController.tabBar.frame), 0); 
} 
29
Wojtek

Ich habe das gleiche Problem und habe es mit Hilfe des Storyboards gelöst. __ Gehen Sie im Tab Bar Controller zum Attribut-Inspector Simulated Metrics und setzen Sie die untere Leiste auf Opake Tab. Das ist es! Siehe Beschreibung unten .enter image description here

Saudações! (Schöne Grüße!)

34
José Flávio

2 Zeilen in viewDidLoad und das ist es! 

self.edgesForExtendedLayout = UIRectEdgeAll;
self.tableview.contentInset = UIEdgeInsetsMake(0.0f, 0.0f, CGRectGetHeight(self.tabBarController.tabBar.frame), 0.0f);
8

Meine Freunde, ich kann Ihnen nicht sagen, wie sehr ich mich damit abgemüht habe. Keine einzige Neukonfiguration von Story Board hat mir immer geholfen. Das Problem war genau wie in Original Post. Ich habe es mit Hilfe von folgenden Problemen behoben:

für Swift 3

self.edgesForExtendedLayout = []

für Ziel-C

self.edgesForExtendedLayout = NO;
8
An Se

In iOS 7 verwendet viewController die volle Höhe. Es gibt eine Eigenschaft als eingeführt 

self.automaticallyAdjustsScrollViewInsets = NO;

stell es auf no. Überprüfen Sie dann, oder setzen Sie UIEdgeInset, wenn nicht direkt danach festgelegt wird.

UIEdgeInsetsMake(top, left, bottom, right)

Siehe hier https://developer.Apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/AppearanceCustomization.html

Edit: Versuchen Sie auch dies 

self.edgesForExtendedLayout = UIRectEdgeNone;
6
Raheel Sadiq

Die Hauptursache für dieses Problem ist, dass automaticallyAdjustsScrollViewInsetsnur in der Scroll-Ansicht First in der VC-Ansicht Hierarchie wirksam ist. Es ist nicht von Apple dokumentiert, aber nur so erkennt VC, dass die Bildlaufansicht geändert werden muss, es sei denn, Sie verwenden einen UITableViewController.

Um Ihr Problem zu beheben, ohne die Insets manuell anzupassen, führen Sie folgende Schritte aus: 

  1. Vergewissern Sie sich, dass "Scroll-Ansicht-Inserts anpassen" aktiviert ist.
  2. Stellen Sie sicher, dass die tableView die Unteransicht first in der Ansicht Hierarchy .. ist. (Bewegen Sie sie über alle anderen Elemente nach oben.)
5
AmitP

UIViewController verfügt über zwei neue Eigenschaften, um Sie zu unterstützen: topLayoutGuide und bottomLayoutGuide. Sie geben die Höhe der Steuerelemente des übergeordneten View-Controllers zurück, die Sie vermeiden müssen. In diesem Fall gibt bottomLayoutGuide den Versatz der Registerkartenleiste zurück. 

Ihr benutzerdefinierter View-Controller überschreibt wahrscheinlich eine Methode und ruft die Implementierung von super nicht auf, wo dies für Sie erledigt würde. Ich vermute, Sie installieren AutoLayout-Einschränkungen oder setzen den Rahmen einer Ansicht manuell, um die Ansicht auszufüllen. Sie müssen nur den Wert von [bottomLayoutGuide length] in Ihre Layoutberechnung aufnehmen. Wenn Sie Rotation unterstützen, sollten Sie diesen Wert in willAnimateRotationToInterfaceOrientation:duration: aktualisieren.

2
Fruity Geek

Ich habe das gleiche Problem. Eine Lösung dafür ist, die Toolbar nicht durchscheinend zu machen. So geht's:

  • Wählen Sie zuerst die Werkzeugleiste aus der Dokumentansicht aus wie hier
  • Deaktivieren Sie dann durchscheinendwie hier

Hoffe das hilft.

Vielen Dank.

1
Minas Kamel

Versuche Folgendes:

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])

 self.edgesForExtendedLayout = UIRectEdgeBottom;
1
asolakhyan

UINavigationController und UITabBarController verfügen beide über ein Transparenzflag, das programmgesteuert oder im Storyboard gesetzt werden kann.

Die Variable UINavigationController verfügt auch über zwei Flags, die steuern, ob sich der Inhalt unter der oberen oder unteren Leiste befindet. Sie können sie wieder programmgesteuert oder im Storyboard festlegen. Dies gilt für alle Unteransichten.

Jede UIViewController kann ihre eigene Präferenz im Code festlegen. Die Eigenschaft heißt edgesForExtendedLayout und Sie können alle Kombinationen einrichten.

Durch die Verwendung dieser Eigenschaften können AutoLayout und Springs'n'Struts die Ansichten unabhängig vom Gerät nach Belieben anpassen.

Es gibt viele weitere neue Eigenschaften in UIViewController, die Sie sich ansehen möchten.

1
Helge Becker

Ich habe mein Problem jetzt gelöst und meinen BaseTableViewController so geändert, dass er von UIViewController zu UITableViewController erbt.

Die Verwendung einer TableView in einem UIViewController ist jedoch nicht gelöst :(

Vielen Dank.

0
Paulo Coutinho

Für diejenigen wie xarly, die den durchscheinenden Effekt wollen, und für eine Autolayout - Lösung (ohne Frames setzen), siehe meine Antwort hier https://stackoverflow.com/a/26419986/1158074

0
Michael Pirotte

vielleicht ist keine richtige Antwort, deshalb poste ich diese Antwort, damit Sie mir sagen können, ob diese Antwort eine mögliche Lösung sein könnte.

In meinem Fall mag ich den durchscheinenden Effekt, daher habe ich eine Fußzeile in die Tabelle eingefügt und die scrollIndicators geändert.

- (void)viewDidLoad
{
    // Do any additional setup after loading the view.
    [super viewDidLoad];
    UIView *footer = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.agendaItemsTable.frame.size.width, self.tabBarController.tabBar.frame.size.height)];
    self.agendaItemsTable.tableFooterView = footer;
    self.agendaItemsTable.scrollIndicatorInsets = UIEdgeInsetsMake(0, 0, self.tabBarController.tabBar.frame.size.height, 0);

}

Was denkst du?

0
xarly

Ich hatte ein ähnliches Problem mit der Sammlungsansicht. Das Ändern des Rahmens für die Sammlungsansicht und des darunter liegenden Inhalts wurde für mich korrigiert ...

    guard let cv = collectionView,
        let tabBar = tabBarController?.tabBar else { return }

    // Resize collection view for tab bar
    let adjustedFrame = CGRect(Origin: cv.frame.Origin,
                               size: CGSize(width: cv.frame.width, height: cv.frame.height - tabBar.frame.height))
    cv.frame = adjustedFrame

    // Adjust content inset for tab bar
    let adjustedContentInsets = UIEdgeInsetsMake(0, 0, tabBar.frame.height, 0)
    cv.contentInset = adjustedContentInsets
    cv.scrollIndicatorInsets = adjustedContentInsets

Viel Glück!

0
nananta

Ich hatte das gleiche Problem und die aufgestimmten Antworten lösten es nicht. Siehe meine Antwort zu einer ähnlichen Frage. Die Tab-Leiste deckt TableView-Zellen in iOS7 ab.

Ich habe das Problem gelöst, indem Sie den Rahmen der Tabellenansicht in der viewWillAppear:-Methode des Tabellenansicht-Controllers manuell auf die Höhe des Bildschirms eingestellt haben (Statusleistenhöhe + Navigationsleistenhöhe + Registerkartenleistenhöhe).

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    // Adjust height of tableview (does not resize correctly in iOS 7)
    CGRect tableViewFrame = self.tableView.frame;
    tableViewFrame.size.height = [self heightForTableView];
    self.tableView.frame = tableViewFrame;
}

- (CGFloat)heightForTableView
{
    return CGRectGetHeight([[UIScreen mainScreen] bounds]) -
           (CGRectGetHeight([[UIApplication sharedApplication] statusBarFrame]) +
            CGRectGetHeight(self.navigationController.navigationBar.frame) +
            CGRectGetHeight(self.tabBarController.tabBar.frame));
}

Wenn jemand eine bessere Lösung für dieses Problem findet, bitte teilen Sie uns!

0
Steph Sharp

Das Problem wurde maskiert mit:

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 112, 0);
}

Aber es löst sich nicht, da ich auf jedem iPhone und in jeder App tableview einen anderen Platz auf der Unterseite habe. 

Das ist also eine schlechte Lösung.

Ich weiß nicht, wie ich es lösen kann.

0
Paulo Coutinho