it-swarm.com.ru

iOS 7 Custom TableView находится под TabBar

Я пытаюсь перенести мое приложение на iOS7, но мой пользовательский TableViewController показывает последнюю строку (ячейку) под TabBar :(

Я ищу много для этого, но я не нахожу никакого решения. Может кто-нибудь мне помочь?

Мой класс просмотра пользовательских таблиц

Ошибка показана на скриншоте удара (показывает только часть последнего продукта, потому что я перетаскиваю вверх, чтобы показать скрытый продукт под панелью вкладок):

screenshot

Благодарю.

30
Paulo Coutinho

Я нашел ответ на ваш вопрос в другом посте, на который ответил dariaa, здесь:

Панель вкладок покрывает ячейки TableView в iOS7

Это отлично сработало для меня.

Пожалуйста, не надо отдавать мне должное, потому что я не тот парень, который решил это.

В вашем пользовательском TableViewController добавьте эти две строки в [super viewDidLoad]:

- (void)viewDidLoad
{
    [super viewDidLoad];

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

У меня возникла та же проблема, и я решил ее, используя раскадровку. В контроллере панели вкладок перейдите в инспектор атрибутов Simulated Metrics и установите для нижней панели значение «Непрозрачная панель вкладок». Вот и все! См. Изображение ниже для описания .enter image description here

Saudações! (Привет!)

34
José Flávio

2 строки в viewDidLoad и все! 

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

Друзья мои, я не могу сказать вам, как сильно я боролся с этим. Ни одна перестройка Story Board мне никогда не помогла. Эта проблема была точно такой же, как в «Исходной почте», мне удалось ее исправить с помощью:

для Swift 3

self.edgesForExtendedLayout = []

для цели-c

self.edgesForExtendedLayout = NO;
8
An Se

В iOS 7 viewController использует полную высоту. Существует свойство, представленное как 

self.automaticallyAdjustsScrollViewInsets = NO;

установите его на нет. затем проверьте или установите UIEdgeInset, если сразу не установлено.

UIEdgeInsetsMake(top, left, bottom, right)

Смотрите здесь https://developer.Apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/AppearanceCustomization.html

Edit: попробуйте также это 

self.edgesForExtendedLayout = UIRectEdgeNone;
6
Raheel Sadiq

Основная причина этой проблемы заключается в том, что automaticallyAdjustsScrollViewInsets действует только в представлении First с прокруткой в ​​иерархии представлений вашего VC. Это не задокументировано Apple, но это единственный способ, которым VC обнаружит представление прокрутки, которое необходимо изменить, если вы не используете UITableViewController.

Таким образом, чтобы решить вашу проблему без ручной настройки вставок, сделайте следующее: 

  1. Убедитесь, что установлен флажок «Настроить вставки вида прокрутки».
  2. Убедитесь, что tableView является подпредставлением first в иерархии представлений ... (переместите его вверх над всеми другими элементами)
5
AmitP

UIViewController имеет два новых свойства, чтобы помочь вам: topLayoutGuide и bottomLayoutGuide. Они возвращают высоту элементов управления родительского контроллера, которых вы должны избегать. В этом случае bottomLayoutGuide вернет смещение панели вкладок. 

Ваш пользовательский контроллер представления, вероятно, переопределяет метод и не вызывает реализацию super, где это будет сделано для вас. Я предполагаю, что вы устанавливаете ограничения AutoLayout или устанавливаете рамку вида вручную, чтобы заполнить вид. Вам просто нужно включить значение из [bottomLayoutGuide length] в расчет макета. Если вы поддерживаете ротацию, вы должны обновить это значение в willAnimateRotationToInterfaceOrientation:duration:.

2
Fruity Geek

У меня такая же проблема. Одним из решений этой проблемы является создание панели инструментов not Translucent. Вот как это сделать:

  • Сначала выберите панель инструментов в средстве просмотра документов как здесь
  • Затем снимите флажок Прозрачныйкак здесь

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

Благодарю.

1
Minas Kamel

Попробуйте следующее:

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

 self.edgesForExtendedLayout = UIRectEdgeBottom;
1
asolakhyan

UINavigationController и UITabBarController оба имеют флаг прозрачности, который можно установить программно или в раскадровке.

У UINavigationController также есть два флага, которые контролируют, распространяется ли содержимое под верхней или нижней панелью. Опять же, вы можете установить их программно или в раскадровке. Это будет применяться ко всем подпредставлениям.

Каждый UIViewController может устанавливать свои собственные предпочтения в коде. Свойство называется edgesForExtendedLayout, и вы можете настроить все комбинации.

Использование этих свойств позволит AutoLayout и Springs'n'Struts корректировать представления так, как вы хотите, независимо от устройства.

В UIViewController появилось намного больше новых свойств, которые вы захотите посмотреть.

1
Helge Becker

Я решил свою проблему сейчас, изменив свой BaseTableViewController для наследования от UIViewController для UITableViewController.

Но использование TableView внутри UIViewController не решается :(

Благодарю.

0
Paulo Coutinho

Для таких как xarly, которые хотят полупрозрачный эффект, и для решения Autolayout (без настройки фреймов), смотрите мой ответ здесь https://stackoverflow.com/a/26419986/1158074

0
Michael Pirotte

возможно, это не правильный ответ, также по этой причине я публикую этот ответ, чтобы вы могли сказать мне, может ли этот ответ быть возможным решением.

В моем случае мне нравится полупрозрачный эффект, поэтому я добавил нижний колонтитул в таблицу и изменил scrollIndicators.

- (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);

}

Как вы думаете?

0
xarly

У меня была похожая проблема с представлением коллекции. Изменение рамки просмотра коллекции и вставки содержимого ниже исправило это для меня ...

    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

Удачи!

0
nananta

У меня была та же самая проблема, и ответы, которые были одобрены, не решили ее. См. Мой ответ на аналогичный вопрос, Панель вкладок покрывает ячейки TableView в iOS7 .

Я решил проблему, вручную установив рамку табличного представления в методе 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));
}

Если кто-то найдет лучшее решение этой проблемы, пожалуйста, поделитесь!

0
Steph Sharp

Проблема была замаскирована с помощью:

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

Но это не решает, потому что на каждом iPhone и на каждом столе приложения у меня есть различное пространство внизу. 

Так что это плохое решение.

Я не знаю способ решить это.

0
Paulo Coutinho