Ответ 1
В случае, если кто-то пропустит раздел "Как закончилась история" в конце (теперь длинного) вопроса, короткий ответ: Используйте простой UIViewController с TableView, а не TableViewController, если вы хотят достичь поставленной цели.
Мой корневой контроллер - это TabBarController (приложение с вкладками). Один из вкладок - UITableViewController. Когда я переключаюсь на это и просматриваю элементы, они отображаются в строке состояния вверху (сигнал, батарея и т.д.). Я не хочу этого. Я хочу, чтобы это было непрозрачно или... что-то. Он визуально сотрясается с текстом ячеек таблицы, перекрывающих содержимое состояния.
Можно ли исправить это из моей раскадровки с некоторыми настройками атрибутов, которые я не понимаю? Или мне нужно добавить некоторые методы в мои подклассы? Или, может быть, мне нужно связать мой UITableViewController с каким-то другим контроллером?
Я пробовал множество вариантов настроек ViewController Layout и Extend Edges на странице атрибутов Storyboard, но ни один из них, похоже, не изменил его к лучшему.
Обновить. Я думаю, что моя проблема очень похожа на iOS 7: UITableView отображается в строке состояния. Единственное отличие состоит в том, что я встроен в TabBarController, и этот случай является корневым представлением. Я попробовал решение, указанное там вложения в NavigationController
и установив Show Navigation Bar
в False
, но это не имело никакого значения.
Экранные снимки:
Моя раскадровка (сокращение), показывающая контроллер с вкладками, с двумя детьми, один вид и другой вид таблицы.
Настройки для контроллера панели вкладок
Настройки для контроллера табличного представления
Как выглядит приложение на моем телефоне
Как закончилась история
Несмотря на множество ответов ниже, никто из них не работал. Какой-то немного, но не совсем. Я также пробовал использовать Embed в NavigationController, и это также имело проблемы. Что все-таки работало, было следующее:
delegate
и tableSource
в качестве нового контроллераВ случае, если кто-то пропустит раздел "Как закончилась история" в конце (теперь длинного) вопроса, короткий ответ: Используйте простой UIViewController с TableView, а не TableViewController, если вы хотят достичь поставленной цели.
Попробуйте это в viewDidLoad:
self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);
20 px - это высота строки состояния. Если у вас есть панель навигации, используйте 64 вместо 20
Если кто-то все еще читает эту тему:
Что сработало для меня, так это также отключить опции "Расширить края" в родительском контроллере панели вкладок. Это дает последовательное поведение в iOS7, а также iOS6.
У меня была такая же проблема при использовании SWRevealController.
Используя комментарии выше и ниже, я смог заставить его работать, поместив это в
-(void)viewWillAppear instead of ViewDidLoad
self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);
Вы пытались добавить что-то вроде этого в метод контроллера viewWillAppear
:
if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
{
self.edgesForExtendedLayout = UIRectEdgeNone;
}
Я добавил следующее в viewWillAppear
self.tableView.contentInset = UIEdgeInsetsMake(22, 0, 0, 0);
Вы также можете решить это с помощью раскадровки.
Выберите "Вид таблицы" из схемы проекта (в левой части редактора), затем перейдите в "Свойства" (справа) > вкладка "Инспектор размеров" > "Просмотр прокрутки" > "Вставки содержимого" > "Верх"
Похоже, вы просто хотите сделать NavBar nonTranslucent, вы можете попробовать использовать
[self.navigationController.navigationBar setTranslucent:NO];
Я столкнулся с той же проблемой, и решение, которое сработало для меня, состояло в том, чтобы добавить представление заголовка раздела:
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
Затем я добавил 20 в начало моего текста в заголовке.
Затем я изменил высоту заголовка, добавив 20 к исходной высоте с помощью
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return myHeight+20;
}
Для меня было простое решение (код в С#, потому что он недействителен)...
Просто в конструкторе UITableViewController создайте новый UIView (установите одинаковый размер TableView).
Добавьте TableView в новое созданное представление.
Установите новый созданный вид в свойство UITableViewController View...
var view = new UIView ();
view.Frame = this.TableView.Frame;
view.AddSubview (this.TableView);
this.View = view;
Как и в iOS 8.4, я не получил нигде с различными вариантами раскадровки, перечисленными в других ответах.
Я работал вокруг этого, не прибегая к каким-либо размерным константам, помещая регулярный вид в мой контроллер табуляции, а затем заполняя это с помощью "Container View", который затем я подключил к моему UITableViewController с "встраиванием" segue.
Моя таблица теперь относится как к моей навигационной панели, так и к панели вкладок внизу.
предположим, что ваша таблица @IBOutlet
@IBOutlet var tableView: UITableView!
создать функцию prepareTable(). добавьте нижеприведенную строку в этот метод
tableView.contentInset.top = UIApplication.shared.statusBarFrame.height
вызов этого метода из ViewDidLoad()
Предположим, что ваше представление структуры или раскадровка - это контроллер панели вкладок, в котором в настоящее время имеется контроллер табличного представления. Когда вы запускаете приложение, ячейки просмотра таблицы работают под строкой состояния, которая, как представляется, имеет прозрачный фон. Это отстой!
Если вы потратили часы на то, чтобы все, что вы могли найти на 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.
Теперь, когда вы запустите свое приложение, у вас будет панель навигации, а ячейки просмотра таблицы больше не будут отображаться в прозрачной строке состояния.
Надеюсь, что это поможет.