it-swarm.com.de

Die Tab-Leiste deckt TableView-Zellen in iOS7 ab

Ich habe einen benutzerdefinierten tableViewController, den ich zu einem TabBarController hinzufüge

self.tabBarController.viewControllers = [NSArray arrayWithObjects:someOtherViewController, customTableViewController, nil];
self.tabBarController.selectedIndex = 1;

Das Problem, das ich habe, ist, dass die letzten 1.5 tableViewCells von der Tab-Leiste am unteren Rand des Bildschirms eines iPhone 4 mit iOS7 abgedeckt werden. Wenn ich den iOS-Simulator - iPhone Retina (4 Zoll)/iOS 7.0 - verwende, besteht das Problem weiterhin.

Was ist der richtige Weg, um tableView mit der oberen Leiste der Tab-Leiste am unteren Rand des Bildschirms auszurichten, ohne 'magische Zahlen' zu verwenden?

30
JuJoDi

Versuchen Sie folgendes für Ihren CustomViewController:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIEdgeInsets adjustForTabbarInsets = UIEdgeInsetsMake(0, 0, CGRectGetHeight(self.tabBarController.tabBar.frame), 0);
    self.scrollView.contentInset = adjustForTabbarInsets;
    self.scrollView.scrollIndicatorInsets = adjustForTabbarInsets;
}
77
dariaa

Es ist eine iOS 8-Lösung, aber es kann unter iOS 7 funktionieren: Gehen Sie zum Storyboard> wählen Sie den Tabellensicht-Controller aus und deaktivieren Sie "Under Bottom Bars". Das ist es! 

example

48
Hans One

Durch Festlegen der contentInset Ihrer Tabellenansicht mit einem .bottom-Wert von 49 Punkten sollte dies korrigiert werden. 

Wenn Sie unter den richtigen Konfigurationen YES für die neue UIViewController-Eigenschaft mit dem Namen automaticallyAdjustsScrollViewInsets für iOS 7 einstellen, sollte dies korrigiert werden. Dies hängt jedoch (wiederum) von vielen anderen Faktoren ab (Ansichtshierarchie, Einstellungen des übergeordneten Ansichtscontrollers usw.).

7
jaredsinclair

Die akzeptierte Antwort funktioniert für mich nicht ganz - mein Setup ist etwas anders. Ich erstelle programmgesteuert meine View-Controller. Der Stamm meiner App ist ein Tab-Leisten-Controller, ein Tab ist ein Navigations-Controller, dessen Stamm eine UIViewController mit einer Tabellenansicht als Hauptansicht ist.

Was für mich funktioniert, ist, wenn ich die Höhe der Tabellenansicht manuell berechnet habe und sie bei der Zuordnung der Tabellenansicht in den Rahmen gesetzt habe. Die allgemeine Formel lautet:

bildschirmhöhe - (Statusleistenhöhe + Navigationsleistenhöhe + Registerkartenleistenhöhe)

6
Matthew Quiros
CGFloat bottom =  self.tabBarController.tabBar.frame.size.height;
NSLog(@"%f",bottom);
[self.tableview setScrollIndicatorInsets:UIEdgeInsetsMake(0, 0, bottom, 0)];
self.tableview.contentInset = UIEdgeInsetsMake(0, 0, bottom, 0);
5
shadox

Betten Sie Ihren Table Controller in einen Navigationscontroller ein. 1. Wählen Sie die Ansicht im Storyboard aus 2. Wählen Sie in der Menüleiste Editor -> Einbetten in -> Navigationscontroller. 

Hoffentlich hilft das

2
Ssemmandarobert

Ich habe eine ähnliche Ansichtshierarchie zu Matt Quiros : UITabBarController -> UINavigationController -> UIViewController -> UITableViewController (eingebettet als Unteransicht des UIViewController). Die anderen Antworten funktionierten in meinem Fall nicht und ich musste den Frame der Tabellenansicht manuell in der viewWillAppear:-Methode des Table View-Controllers einstellen.

- (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 findet, bitte teilen!

1
Steph Sharp

Sie können auch viewDidLayoutSubviews implementieren und bottomLayoutGuide verwenden, um die Höhe der Registerkartenleiste zu ermitteln:

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    CGFloat bottomOffset = self.bottomLayoutGuide.length;

    self.tableView.contentInset = UIEdgeInsetsMake(0, 0, bottomOffset, 0);
}
0
Paul Newman

Obwohl das Ändern des contentInset Ihrer Tabellenansicht eine funktionierende Lösung ist, finde ich es besser, sicherzustellen, dass Ihre Tabellenansicht vor der Tab-Leiste stoppt.

Wie Paul Newman sagte, ist die Verwendung des bottomLayoutGuide eine gute Sache, insbesondere wenn Sie Autolayout verwenden. In meinem Fall war das Hinzufügen einer Einschränkung am unteren Rand der Tableview, die auf den oberen Rand des BottomLayoutGuide verweist, eine saubere Lösung Beispiel mit Storyboard, kann aber auch in Code ausgeführt werden.

enter image description here

Ich hoffe es hilft.

0
Michael Pirotte

Ich denke, das würde für Sie besser funktionieren:

Nach [super viewDidLoad];

versuchen Sie den folgenden Code:

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;
0
DominicanCoder