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

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

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

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

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

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

Экранные снимки:

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

Storyboard

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

tab bar controller settings

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

table view controller settings

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

enter image description here

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

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

  • Добавить UIViewController
  • Установить отношение дочернего контроллера к нему и контроллеру панели вкладок (как и другие два, которые у меня уже были)
  • Добавить TableView (не контроллер) в новый UIViewController, по желанию, он будет привязан к нижней строке строки состояния.
  • Установите TableView delegate и tableSource в качестве нового контроллера
  • Создайте пользовательский подкласс UIViewController и обновите тип класса контроллера в раскадровке
  • Скопируйте связанные с таблицей методы из моего пользовательского подкласса UITableViewController в мой новый подкласс
  • Выберите ячейку таблицы прототипов из оригинала и команду + перетащите ее в новое представление таблицы.
  • С радостью удалите исходный TableViewController (и wrapper navigationController) тоже
  • Обновите элемент панели вкладок, чтобы соответствовать предыдущему
  • Отбросьте еще один вариант для "вы пытаетесь усердно"
4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

Если кто-то все еще читает эту тему:

Что сработало для меня, так это также отключить опции "Расширить края" в родительском контроллере панели вкладок. Это дает последовательное поведение в iOS7, а также iOS6.

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

Вы также можете решить это с помощью раскадровки.

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

Ответ 8

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

[self.navigationController.navigationBar setTranslucent:NO];

Ответ 9

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

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

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

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

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

Ответ 10

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

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

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

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

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

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

this.View = view;

Ответ 11

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

Я работал вокруг этого, не прибегая к каким-либо размерным константам, помещая регулярный вид в мой контроллер табуляции, а затем заполняя это с помощью "Container View", который затем я подключил к моему UITableViewController с "встраиванием" segue.

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

Ответ 12

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

 @IBOutlet var tableView: UITableView!

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

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

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

Ответ 13

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

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

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

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

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

  • Перейдите в область "Утилиты" Interface Builder и выберите библиотеку объектов из панели библиотеки.

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

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

  • Выберите соединение отношений между вашим контроллером панели вкладок и контроллером табличного представления и нажмите "Удалить".

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

  • Управляйте перетаскиванием с экрана панели управления вкладкой на сцену навигационного контроллера и выберите "Сцепление Segue, контроллер просмотра".

  • Управляйте перетаскиванием с вашего сценария навигационного контроллера на сцену контроллера табличного представления и выберите "Связь Segue, контроллер корневого представления".

  • Наконец, в библиотеке объектов Utilities перетащите объект "Элемент навигации" в представление таблицы сцен Table View Controller.

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

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