Я недавно загрузил Xcode 5 DP для тестирования своих приложений в iOS 7. Первое, что я заметил и подтвердил, это то, что границы моего представления не всегда изменяются с учетом строки состояния и панели навигации.
В viewDidLayoutSubviews
, я печатаю границы представления:
{{0, 0}, {320, 568}}
В результате мой контент появляется под панелью навигации и строкой состояния.
Я знаю, что могу сам рассчитать высоту, получив высоту основного экрана, вычтя высоту строки состояния и высоту панели навигации, но это кажется ненужной дополнительной работой.
Как я могу исправить эту проблему?
Обновить:
Я нашел решение для этой конкретной проблемы. Установите для полупрозрачного свойства панели навигации значение NO:
self.navigationController.navigationBar.translucent = NO;
Это предотвратит отображение вида под панелью навигации и строкой состояния.
Однако я не нашел исправления для случая, когда вы хотите, чтобы панель навигации была полупрозрачной. Например, при просмотре фотографии в полноэкранном режиме, я хочу, чтобы навигационная панель была полупрозрачной, а вид под ней был обрамлен. Это работает, но когда я переключаю показ / скрытие панели навигации, я получаю еще более странные результаты. Первое подпредставление (UIScrollView) получает свои границы и происхождение меняется каждый раз.
Ответы:
Вы можете добиться этого, внедрив новое свойство под названием
edgesForExtendedLayout
iOS7 SDK. Пожалуйста, добавьте следующий код для достижения этой цели,Вы должны добавить вышеупомянутое в вашем
-(void)viewDidLoad
методе.Пожалуйста, обратитесь, Apple Doc
источник
Вам не нужно вычислять, как далеко все сдвинуть вниз, для этого есть встроенное свойство. В Интерфейсном Разработчике выделите свой контроллер представления и затем перейдите к инспектору атрибутов. Здесь вы увидите несколько флажков со словами «Расширить края». Как вы можете видеть, на первом скриншоте выбор по умолчанию - отображение контента под верхней и нижней полосами, а не под непрозрачными полосами, поэтому настройка стиля полосы на непрозрачный работает для вас.
Как вы можете увидеть на первом скриншоте, под панелью навигации скрываются два элемента пользовательского интерфейса. (Я включил каркасы в IB, чтобы проиллюстрировать это). Эти элементы, UIButton и UISegmentedControl, имеют свое начало "y", установленное в ноль, и контроллер представления установлен, чтобы разрешить контент ниже верхней панели.
Этот второй снимок экрана показывает, что происходит, когда вы снимаете флажок «Under Top Bars». Как вы можете видеть, представление контроллеров представления было смещено соответствующим образом, чтобы его начало координат y находилось прямо под панелью навигации.
Это также может быть достигнуто программно с помощью
-[UIViewController edgesForExtendedLayout]
. Вот ссылка на ссылку на класс для edgeForExtendedLayout и для UIRectEdgeисточник
Я создал свой вид программно, и это сработало для меня:
Источник (в разделе topLayoutGuide внизу стр. 39).
источник
topLayoutGuide
только iOS7.Решение Swift 3 / Swift 4, которое также работает с файлами NIB / XIB в iOS 10+:
источник
Если вы хотите, чтобы представление имело полупрозрачную навигационную панель (что довольно мило), вы должны установить contentInset или подобное.
Вот как я это делаю:
источник
contentInset
является собственностьюUIScrollView
. Что делать, если мой основной вид не подклассUIScrollView
. Тогда как бы я исправить проблему с перекрытием?edgesForExtendedLayout
делает то же самое для iOS 7. Однако, если вы создаете приложение в iOS 7 SDK и развертываете его в iOS 6, панель навигации выглядит полупрозрачной, и виды переходят под нее. Итак, чтобы исправить это как для iOS 7, так и для iOS 6, сделайте следующее:источник
В вашем списке приложений добавьте строку, назовите ее «Просмотр внешнего вида строки состояния на основе контроллера» и установите для нее значение « НЕТ» .
источник
Самый простой трюк - открыть файл NIB и выполнить эти два простых шага:
И результат :
источник
Быстрое решение:
источник
super.viewWillAppear(animated)
Я хотел бы расширить ответ Stunner и добавить
if
утверждение, чтобы проверить, является ли это iOS-7, потому что, когда я тестировал его на iOS 6, мое приложение зависало.Дополнение будет добавлять:
Поэтому я бы предложил добавить этот метод в ваш
MyViewControler.m
файл:источник
Свифт 3
источник
У меня есть сценарий, в котором я использую BannerViewController, написанный Apple для отображения моих объявлений, и ScrollViewController, встроенный в BannerViewController.
Чтобы панель навигации не скрывала мой контент, мне пришлось внести два изменения.
1) Изменить BannerViewController.m
2) Изменить мой ScrollViewContoller
Теперь реклама правильно отображается в нижней части окна, а не закрывается панелью навигации, а содержимое вверху не обрезается.
источник
просто установите следующий код в поле зрения появится.
источник
сделать ограничения для Top Layout, как это
источник
Swift 4.2 - Xcode 10.0 - iOS 12.0:
источник
Для меня самое простое решение - добавить два ключа в список.
источник
Добавьте ключ «Просмотреть внешний вид строки состояния на основе контроллера» из выпадающего списка в виде строки
info.plist
. Что-то вроде этого:источник
У меня была та же проблема с моим приложением на iPad (armv7, armv7s, amr64) только при представлении другого UIViewController, и после их отклонения появляется панель навигации под строкой состояния ... Я трачу много времени, чтобы найти какое-либо решение для этого. Я использую раскадровку и в InterfaceBuilder для UIViewController, который делает ужасно, я устанавливаю презентацию из FullScreen -> Current Context, и это решает эту проблему. Это работает в моем приложении только для iPad => iOS8.0 (тестирование с iOS8.1) и для iPad с iOS 7.1 не работает !!
источник
Шаги для скрытия строки состояния в iOS 7:
1. Перейдите в файл приложения info.plist.
2.И установить, просмотреть внешний вид строки состояния контроллера: Boolean NO
Надеюсь, я решил проблему со статусной строкой .....
источник
В моем случае прерывание loadView ()
этот код: self.edgesForExtendedLayout = UIRectEdgeNone
но после удаления loadView () все работало нормально
источник