Панель вкладок охватывает ячейки TableView в iOS7
У меня есть пользовательский tableViewController, который я добавляю в TabBarController с
self.tabBarController.viewControllers = [NSArray arrayWithObjects:someOtherViewController, customTableViewController, nil];
self.tabBarController.selectedIndex = 1;
Проблема, с которой я столкнулась, заключается в том, что последние 1.5 tableViewCells закрываются панелью вкладок внизу экрана на iPhone 4 под управлением iOS7. Когда я использую iOS Simulator - iPhone Retina (4-inch)/iOS 7.0, проблема все еще существует.
Каков правильный способ заставить tableView выравниваться вверху tabBar в нижней части экрана без использования "магических чисел"?
Ответы
Ответ 1
Попробуйте это для своего CustomViewController:
- (void)viewDidLoad
{
[super viewDidLoad];
UIEdgeInsets adjustForTabbarInsets = UIEdgeInsetsMake(0, 0, CGRectGetHeight(self.tabBarController.tabBar.frame), 0);
self.scrollView.contentInset = adjustForTabbarInsets;
self.scrollView.scrollIndicatorInsets = adjustForTabbarInsets;
}
Ответ 2
Это решение iOS 8, но оно может работать на iOS 7: Перейти к раскадровке > выбрать контроллер табличного представления > снимите отметку "Under Bottom Bars". Это!
![example]()
Ответ 3
Настройка contentInset
вашего представления таблицы с помощью значения .bottom
в 49 пунктов должна исправить это.
В правильных конфигурациях установка YES
для нового свойства UIViewController в iOS 7 под названием automaticallyAdjustsScrollViewInsets
должна исправить это, но (опять же) это зависит от множества других факторов (иерархия представлений, настройки контроллера родительского представления и т.д. так далее).
Ответ 4
Принятый ответ не совсем подходит для меня - мой настрой немного отличается. Я программно создаю свои контроллеры. Мой корень приложения - это контроллер панели вкладок, одна вкладка - контроллер навигации, корень которого - UIViewController
с представлением таблицы в качестве основного вида.
Что работает для меня, так это когда я вручную вычислял высоту табличного представления и устанавливал ее в фрейме при инициализации табличного представления. Общая формула:
высота экрана - (высота строки состояния + высота панели навигации + высота столбца)
Ответ 5
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);
Ответ 6
Вставьте контроллер таблицы в контроллер навигации.
1. выберите вид в доске объявлений.
2. В строке меню выберите Редактор → встроить в → навигационный контроллер.
Надеюсь, что поможет
Ответ 7
У меня похожая иерархия представлений на Matt Quiros: UITabBarController → UINavigationController → UIViewController → UITableViewController (встроен в подзаголовок UIViewController). Другие ответы не были выполнены в моем случае, и мне нужно было установить рамку представления таблицы вручную в методе управления табличным представлением viewWillAppear:
.
- (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));
}
Если кто-то найдет лучшее решение, поделитесь!
Ответ 8
Я думаю, что это будет лучше для вас:
После [super viewDidLoad];
попробуйте следующий код:
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeNone;
Ответ 9
Вы также можете реализовать viewDidLayoutSubviews
и использовать bottomLayoutGuide
для получения высоты панели вкладок:
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
CGFloat bottomOffset = self.bottomLayoutGuide.length;
self.tableView.contentInset = UIEdgeInsetsMake(0, 0, bottomOffset, 0);
}
Ответ 10
Несмотря на то, что изменение содержимогоInset вашего Table View является рабочим решением, я считаю, что лучше следить за тем, чтобы ваш стол был остановлен перед Tabbar.
Как сказал Пол Ньюман, использование bottomLayoutGuide - это хорошо, особенно если вы используете автозапуск.
В моем случае добавление ограничения в нижней части таблицы, ссылающейся на верхнюю часть BottomLayoutGuide, было чистым решением, это пример с Storyboard, но это можно сделать и в коде.
![enter image description here]()
Надеюсь, что это поможет.