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?
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;
}
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!
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.).
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)
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);
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
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!
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);
}
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.
Ich hoffe es hilft.
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;