it-swarm.com.ru

Как сделать так, чтобы мой iOS7 UITableViewController НЕ появлялся под верхней строкой состояния?

Мой корневой контроллер - TabBarController (приложение с вкладками). Одной из вкладок является UITableViewController. Когда я переключаюсь на это и прокручиваю элементы, они отображаются в строке состояния вверху (сигнал, батарея и т.д.). Я не хочу этого Я хочу, чтобы это было непрозрачным или ... что-то. Это визуально перекликается с текстом ячеек таблицы, лежащих в основе состояния статуса.

Можно ли это исправить с помощью раскадровки с некоторыми атрибутами, которые я не понимаю? Или мне нужно добавить некоторые методы в мои подклассы? Или, может быть, мне нужно обернуть свой UITableViewController каким-то другим видом контроллера?

Я пробовал многочисленные варианты настроек ViewController Layout и Extend Edges на странице атрибутов раскадровки, но ни один из них, похоже, не изменит его в лучшую сторону.

Update: я думаю, что моя проблема очень похожа на iOS 7: UITableView отображается в строке состояния . Единственное отличие состоит в том, что я встроен в TabBarController, и этот случай является корневым представлением. Я попробовал перечисленное там решение встраивания в NavigationController и установки Show Navigation Bar в False, но это не имело никакого значения.

Снимки экрана:

Моя раскадровка (сокращенная), показывающая контроллер с вкладками, с двумя дочерними элементами, одним представлением и другим представлением таблицы.

Storyboard

Настройки для контроллера панели вкладок

tab bar controller settings

Настройки для контроллера табличного представления

table view controller settings

Как приложение выглядит на моем телефоне

enter image description here

Как закончилась история

Несмотря на множество ответов ниже, ни один из них не сработал. Как-то немного, но не совсем. Я также попробовал подход Embed in NavigationController, и у него тоже были проблемы. Что работало, хотя, было это:

  1. Добавить UIViewController
  2. Установите для него отношения дочернего контроллера и контроллера панели вкладок (как и два других, которые у меня уже были)
  3. Добавьте TableView (не контроллер) к новому UIViewController, расположите его по желанию, он будет привязан к нижней части строки состояния
  4. Установите TableView delegate и tableSource в качестве нового контроллера
  5. Создайте пользовательский подкласс UIViewController и обновите тип класса контроллера в раскадровке
  6. Скопируйте связанные с таблицей методы из моего пользовательского подкласса UITableViewController в мой новый подкласс
  7. Выделите ячейку таблицы-прототипа из оригинала и Ctrl + перетащите ее в новое представление таблицы
  8. К счастью удалить оригинальный TableViewController (и оболочку NavigationController) тоже
  9. Обновите элемент панели вкладок, чтобы он соответствовал предыдущему
  10. Напрягите еще один за "ты стараешься"
33
Travis Griggs

В случае, если кто-то пропустит Как закончился рассказ в конце (теперь длинного) вопроса, краткий ответ: Используйте простой UIViewController с TableView вместо TableViewController, если вы хотите достичь заявленной цели.

2
Travis Griggs

Попробуйте это в viewDidLoad:

self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);

20 пикселей - высота строки состояния. Если у вас есть панель навигации, используйте 64 вместо 20

33
JustAnotherCoder

В случае, если кто-то еще читает эту тему:

Что мне помогло, так это снятие флажка «Расширить края» в родительском контроллере панели вкладок. Это дает последовательное поведение в iOS7, а также iOS6.

15
Florian

У меня была такая же проблема при использовании SWRevealController. 

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

-(void)viewWillAppear instead of ViewDidLoad
     self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);
5
user3696154

Вы пытались добавить что-то вроде этого в метод viewWillAppear контроллера представления:

 if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
 {
    self.edgesForExtendedLayout = UIRectEdgeNone;
 }
4
Robert

Вы также можете решить это через раскадровку.

Выберите представление таблицы в структуре проекта (слева от редактора), а затем перейдите в «Свойства» (справа)> вкладка «Инспектор размеров»> «Просмотр прокрутки»> «Вставки содержимого»> «Вверх».

2
Elsa

Я добавил следующее в viewWillAppear

self.tableView.contentInset = UIEdgeInsetsMake(22, 0, 0, 0);
2
Brian Broom

Похоже, вы просто хотите сделать NavBar непрозрачным, вы можете попробовать использовать 

[self.navigationController.navigationBar setTranslucent:NO];
1
hv88

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

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

Затем я добавил 20 к Origin.y моего текста в заголовке.

Затем я изменил высоту заголовка, добавив 20 к исходной высоте, используя 

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return myHeight+20;
}
1
RYUX123

Начиная с iOS 8.4 я нигде не разбирался с различными вариантами раскадровки, перечисленными в других ответах.

Я работал над этим, не прибегая к каким-либо размерным константам, помещая обычное представление в мой контроллер вкладок, а затем заполняя его «Контейнерным представлением», которое я затем подключил к своему UITableViewController с помощью «встроенного» перехода.

Моя таблица теперь учитывает как панель навигации, так и панель вкладок внизу.

1
bitmusher

предположим, что @IBOutlet вашего стола

 @IBOutlet var tableView: UITableView!

создать функцию prepareTable (). добавьте следующую строку в этот метод

tableView.contentInset.top = UIApplication.shared.statusBarFrame.height

вызовите этот метод из ViewDidLoad ()

1
Dilip Jangid

Для меня простое решение было (код на C #, потому что, кажется, является недействительным) ...

  1. Просто в конструкторе UITableViewController создайте новый UIView (установите такое же измерение TableView).

  2. Добавьте TableView в новое созданное представление. 

  3. Установите новый созданный вид в свойстве View UITableViewController ...

О конструкторе UITableViewController

var view = new UIView ();
view.Frame = this.TableView.Frame;
view.AddSubview (this.TableView);

this.View = view;
1
Ricardo LR

Допустим, ваше представление Outline, или Storyboard, является контроллером панели вкладок, который в настоящее время имеет контроллер табличного представления. Когда вы запускаете приложение, ваши ячейки табличного представления работают под строкой состояния, которая, кажется, имеет прозрачный фон. Это отстой!

Если вы часами пробовали все, что могли найти в StackOverflow, безрезультатно, казалось, что действительно настало время подумать о новой карьере, и вы готовились набрать 1-800-LUV-TRUK или 1-800-SHT-KIKR, дайте себе похлопайте по спине, откройте любой эликсир, который вы пьете в такое время, потому что это не ваша вина. В самом деле. Трэвис абсолютно прав, что никакое количество кода в viewDidLoad, viewWillAppear или viewDidAppear или кнопка выбора/отмены выбора в IB не поможет в этой ситуации. 

Приведенное выше решение Трэвиса, безусловно, будет работать, но оно немного длинное, есть копирование и вставка кода, у меня короткое внимание, так что эпизод «Bugs Bunny» для меня выглядит как полнометражный фильм, так что я просто знаю, что я напортачу что нибудь сложное. Но, эй, ваш пробег может, скорее всего, будет меняться. Anyhoo ...

В Xcode 7.3 для приложения под управлением iOS 9 (я предполагаю, что 7 и 8, но я не знаю это наверняка и в настоящее время слишком ленив, чтобы проверить), есть более простой способ, который не требует написания какого-либо кода. И все это делается в Интерфейсном Разработчике XCode.

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

  1. Перейдите в область Утилиты Интерфейсного Разработчика и выберите библиотеку объектов на панели библиотеки.

  2. Выберите объект контроллера навигации и перетащите его в сцену раскадровки. Вы заметите, что во время перетаскивания появляются два элемента сцены - это сцена контроллера навигации и сценария контроллера табличного представления. 

  3. Удалите дублирующую сцену контроллера табличного представления, которая пришла вместе с вашей сценой контроллера навигации.

  4. Выберите связь между вашим контроллером панели вкладок и вашим контроллером табличного представления и нажмите «Удалить».

  5. Переместите навигационный контроллер и контроллер табличного представления так, как вы хотите, в вашей раскадровке.

  6. Удерживая клавишу «Control», перетащите курсор со своей сцены контроллера панели вкладок на сцену контроллера навигации и выберите «Segement Segue, view controller».

  7. Удерживая клавишу Control, перетащите курсор со своей сцены контроллера навигации на сцену контроллера табличного представления и выберите «Segement Segue, контроллер корневого представления».

  8. Наконец, в библиотеке объектов утилит перетащите объект элемента навигации в табличное представление сцены контроллера таблиц. 

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

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

0
Jim Hillhouse