Подтвердить что ты не робот

Панель вкладок охватывает ячейки 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 в нижней части экрана без использования "магических чисел"?

4b9b3361

Ответ 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

Надеюсь, что это поможет.