Первый экран моего приложения - UITableViewController
без панели навигации, что означает, что контент течет под строкой состояния, поэтому возникает много текстовых коллизий. Я отрегулирована как свойства для Under top bars
и Adjust scroll view insets
которые на самом деле остановить его от прокрутки под землей, но за счет сохранения в верхней части представления таблицы под. Я попытался установить UITableView
смещение кадра на 20 пикселей, но оно, похоже, не вступает в силу, и, поскольку в настоящее время мне необходимо, чтобы приложение было совместимо с iOS 6, я не могу перейти к раскадровкам iOS 7, чтобы принудительно использовать автоматическую разметку верхняя направляющая высоты. Кто-нибудь нашел решение, которое работает для обеих версий?
Вещи, которые я пробовал: настройка edgesForExtendedLayout
, изменение настроек в раскадровке Under top bars
и Adjust scroll view
принудительное перемещение кадра в новую область.
Одна картинка стоит тысячи слов:
источник
UITableView
заголовок, он также течет под строкой состояния.Ответы:
Для тех, кто заинтересован в тиражировании, просто выполните следующие действия:
UIViewController
UITableViewController
из библиотеки объектовЕсли вы выполните вышеуказанные шаги, при запуске приложения вы увидите, что ничто, в том числе настройка флажков Xcode на «Расширить края под полосами {Top, Bottom, Opaque}», не будет препятствовать появлению первой строки под строкой состояния, и вы не можете решить эту проблему программно.
Например , в приведенном выше сценарии, следующий не будет иметь не эффект:
Эта проблема может быть очень неприятной, и я считаю, что это ошибка на стороне Apple, особенно потому, что она обнаруживается в их собственных предварительно смонтированных
UITableViewController
из библиотеки объектов.Я не согласен со всеми, кто пытается решить эту проблему, используя любую форму «Магических чисел», например «использовать дельту в 20 пикселей». Этот вид тесно связанных программ определенно не то, что Apple хочет, чтобы мы делали здесь.
Я обнаружил два решения этой проблемы:
Сохранение
UITableViewController
сцены :если вы хотите сохранить
UITableViewController
в раскадровке, не помещая ее вручную в другое представление, вы можете встроить ееUITableViewController
вUINavigationController
(Editor> Embed In> Navigation Controller) и снять флажок «Показывает панель навигации» в инспекторе. , Это решает проблему без необходимости дополнительной настройки, а также сохраняет вашиUITableViewController
сцену в раскадровке.Использование AutoLayout и встраивание
UITableView
в другое представление (я думаю, именно так Apple хочет, чтобы мы это делали) :создайте пустое
UIViewController
и перетащитеUITableView
его в него. Затем, удерживая клавишу Ctrl, перетащитеUITableView
курсор в строку состояния. Когда мышь опустится до нижней части строки состояния, вы увидите всплывающую подсказку с надписью «Top Layout Guide». Отпустите кнопку мыши и выберите «Вертикальный интервал». Это скажет системе макета разместить ее прямо под строкой состояния.Я протестировал оба способа на пустом приложении, и они оба работают. Возможно, вам придется сделать некоторые дополнительные настройки, чтобы они работали для вашего проекта.
источник
Если вы делаете что-то программно и используете
UITableViewController
безUINavigationController
ставки, лучше всего сделать следующееviewDidLoad
:Свифт 3
Ранее Свифт
UITableViewController
Будет по- прежнему прокручивать за строкой состояния , но не будет под ним , когда прокручиваются к вершине.источник
topLayoutGuide
вместо этого используйте длину.UIApplication.sharedApplication.statusBarFrame.size.height
вместо 20.Обратите внимание: это сработало для меня для следующей конфигурации:
Если два вышеуказанных требования не выполнены, ваш пробег может отличаться.
Оригинальный пост
Я создал свой вид программно, и это сработало для меня:
Источник (в разделе topLayoutGuide внизу стр. 39).
источник
Добавление к верхнему ответу:
после того, как 2-й метод изначально не работал, я немного поработал и нашел решение.
TLDR; 2-е решение верхнего ответа почти работает, но для некоторых версий xCode ctrl + перетаскивание в «Top Layout Guide» и выбор вертикального интервала ничего не делает. Тем не менее, сначала изменив размер табличного представления, а затем выбрав «Руководство по макету сверху вниз», можно работать.
Перетащите пустой ViewController на раскадровку.
Перетащите объект UITableView в представление. (Не UITableViewController). Расположите его в самом центре, используя синие направляющие.
Создайте свой собственный подкласс UIViewController и добавьте
<UITableViewDataSource, UITableViewDelegate>
протоколы. Не забудьте установить ViewController вашей раскадровки на этот класс в Identity Inspector.Создайте выход для вашего TableView в файле реализации и назовите его «tableView»
Теперь для части не вырезать в строке состояния.
Теперь вы можете настроить свой вид таблицы как обычно, и он не будет обрезать строку состояния!
источник
https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/SupportingEarlieriOS.html#//apple_ref/doc/uid/TP40013174-CH14-SW1
источник
self.topLayoutGuide.length
изviewDidLayoutSubviews
будет испортить макет дочерних представлений.Выберите UIViewController на вашей раскадровке и снимите флажок Расширить края под верхними полосами. Работал на меня. :)
источник
Вот как написать это в «Swift» - корректировку ответа @ lipka:
источник
- (void)viewDidLayoutSubviews { if (self.tableView.contentInset.top != self.topLayoutGuide.length) { self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0); } }
Для Xcode 7 снятие галочки с «полупрозрачной» галочки на панели навигации сработало для меня.
источник
Это исправит это для UITableViewController (без каких-либо магических чисел). Единственное, что я не смог исправить, это то, что вы разговариваете по телефону, и в этом случае верхняя часть tableView слишком сильно надавливается. Если кто-нибудь знает, как решить эту проблему, пожалуйста, сообщите нам.
источник
Я не знаю, насколько он кошерный, но я обнаружил, что эта схема сдвигает представление ViewController вниз и обеспечивает строку состояния сплошным фоном:
Конечно, заменить
redColor
любой цвет, который вы хотите для фона.Вы должны отдельно сделать один из вариантов, чтобы установить цвет символов / символов в строке состояния. Я использую
View controller-based status bar appearance = NO
иStatus bar style = Opaque black style
в plist, чтобы сделать это глобально.Кажется, работает, и мне было бы интересно услышать о каких-либо ошибок или проблем с ним.
источник
Ответ chappjc прекрасно работает при работе с XIB.
Я обнаружил, что самое чистое решение при создании TableViewControllers программным способом - это обернуть экземпляр UITableViewController в другой UIViewController и установить соответствующие ограничения.
Вот:
Ура, Бен
источник
Я думаю, что подход к использованию UITableViewController может немного отличаться от того, что вы делали раньше. Это сработало для меня, но вы, возможно, не фанат этого. Я сделал контроллер представления с контейнером, который указывает на мой UItableViewController. Таким образом, я могу использовать TopLayoutGuide, предоставленный в раскадровке. Просто добавьте ограничение к представлению контейнера, и вы должны позаботиться об iOS7 и iOS6.
источник
Я закончил тем, что использовал одно дополнительное представление с желаемым фоном, добавленное после TableView и помещенное под строку состояния:
Это не очень красиво, но довольно простое решение, если вам нужно работать с представлениями без Xib, а также с IOS6 и IOS7
источник
Я сделал это для отображения Retina / Non-Retina как
источник
Следующее решение работает достаточно хорошо в коде без использования магических констант и учитывает изменение пользователем класса размера, например, с помощью ротации или параллельных приложений на ipads:
источник
Работает на swift 3 - во viewDidLoad ();
Этот код: 1. Получает высоту строки состояния. 2. Предоставляет в верхней части таблицы представление содержимого, равное высоте строки состояния. 3. Придает индикатору прокрутки ту же вставку, чтобы он отображался под строкой состояния.
источник
Для таких, как я, которые предпочли бы не вставлять их
UITableViewController
вUIViewController
это:Пользовательский
UITableViewController
подкласс может добавить представление маски к суперпредставлению tableView. Добавьте маску в viewDidAppear и удалите маску в viewWillDisappear.источник
У меня был UISearchBar в верхней части моего UITableView, и следующее работало;
Поделитесь и наслаждайтесь ...
источник
Я получил его, установив размер для произвольной формы
источник
Решение Абрахамчеза https://developer.apple.com/library/ios/qa/qa1797/_index.html работало для меня следующим образом. У меня был один UITableviewcontroller в качестве моего начального представления. Я пробовал код смещения и встраивание в navcon, но ни один из них не решил прозрачность строки состояния.
Добавьте Viewcontroller и сделайте его начальным представлением. Это должно показать вам важные руководства по макетам верха и низа.
Перетащите старый табличный вид в представление в новом контроллере.
Сделайте все, чтобы дооснастить стол новым контроллером:
Измените старый файл view controller.h, чтобы он наследовал / подкласс от UIViewController вместо UITableViewController.
Добавьте UITableViewDataSource и UITableViewDelegate в .h контроллера вида.
Повторно подключите все, что нужно в раскадровке, например панель поиска.
Главное, чтобы установить ограничения, как в Apple Q & A. Я не стал вставлять панель инструментов. Не уверен в точной последовательности. Но красный значок появился в руководствах по макету, возможно, когда я построил. Я щелкнул по нему и позволил Xcode установить / очистить ограничения.
Затем я нажимал везде, пока не нашел ограничение вертикального пространства и изменил его верхнее значение с -20 на 0, и оно заработало отлично.
источник
Я использую UISplitViewController с контроллером навигации и контроллером таблицы. Это сработало для меня в главном представлении после того, как я попробовал много решений здесь:
Это похоже на решение Hot Licks, но применяет подпредставление к navigationController.
источник
источник
Вот Свифт 2.3. (Xcode 8.0) решение. Я создал подкласс UITableView.
Вкладка содержимого всегда должна быть нулевой (по умолчанию). Я устанавливаю ноль вручную. Вы также можете добавить метод проверки, который выполняет проверку, и если это что-то отличное от того, что вы хотите, просто получите правильный прямоугольник. Изменение отразится только тогда, когда будет отображено представление таблицы (что случается не часто).
Не забудьте обновить TableView в вашем IB (в TableViewController или просто в TableView внутри вашего ViewController).
источник
Я столкнулся с этой проблемой в ios 11, но макет был правильным для ios 8 - 10.3.3. Для моего случая я установил ограничение вертикального пространства Superview.Top Margin вместо Superview.Top, которое работает для ios 8 - 11.
источник
Я нашел самый простой способ сделать это, особенно если вы добавляете свое табличное представление внутри панели вкладок, это сначала добавить представление, а затем добавить табличное представление внутри этого представления . Это дает вам верхние поля, которые вы ищете.
источник
увидеть все решения: мой проект просто использует xib, поэтому решение с раскадровкой не работает для меня. self.edgesForExtendedLayout = UIRectEdgeNone; просто работает для контроллера, если видна панель навигации. но если у вашего представления просто есть строка состояния, это не сработает. поэтому я объединяю два условия.
помочь это работает.
источник
Если вам также нужна поддержка iOS 6, вам придется условно переместить ее вниз. То есть в iOS 7 вы должны просто сдвинуть его вниз на 20 пунктов (либо через
frame
манипуляции, либо с помощью автоматического макета), а в iOS 6 вы оставите его в покое. Я не верю, что вы можете сделать это в IB, поэтому вам придется делать это в коде.РЕДАКТИРОВАТЬ
Вы можете сделать это в IB, используя дельты iOS6 / iOS7. Установите свою позицию в iOS 7, затем для iOS 6 установите дельта Y на -20 баллов. Смотрите этот вопрос так для получения дополнительной информации.
источник
self.view.frame
иself.tableView.frame
в обоих,viewWillAppear
и вviewDidLoad
. Чтобы быть в безопасности, я также установилsetContentNeedsDisplay
перерисовку.