В iOS 7 UIStatusBar
он был разработан таким образом, что он сливается с таким представлением:
(GUI разработан Тиной Тавчар )
Это круто, но это несколько испортит ваш взгляд, когда у вас есть что-то в верхней части вашего обзора, и это будет перекрываться со строкой состояния.
Есть ли простое решение (например, установка свойства в info.plist), которое может изменить способ его работы (не перекрывая) обратно на то, как оно работает в iOS6?
Я знаю, что более простое решение состоит в том, чтобы иметь
self.view.center.x
+ 20 баллов для каждого отдельного контроллера представления, но изменение их приведет к изменению других размеров (другоеself.view.center.x
может вызвать проблемы для пользовательских сегментов и т. Д.), И внезапно оно превращается в утомительную работу, которая лучше всего избегатьЯ действительно буду рад, если кто-то может предоставить мне однострочное решение для этого.
PS Я знаю, что могу скрыть строку состояния, выполняя такие вещи, как
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
В didFinishLaunchingWithOptions
методе, но это обходной путь, ярлык, позволяющий избежать проблемы, поэтому я не считаю это реальным решением.
UIStatusBarDefault
строки состояния делает ее содержимое только черным. Он не собирается возвращаться к тому, как он работает в iOS6.Ответы:
Это перекрестная публикация из сообщения в блоге, которое я написал , но вот полное краткое описание строк состояния, панелей навигации и контроллеров представления контейнера в iOS 7:
Нет способа сохранить макет строки состояния стиля iOS 6. Строка состояния всегда будет перекрывать ваше приложение на iOS 7
Не путайте внешний вид строки состояния с разметкой строки состояния. Внешний вид (светлый или по умолчанию) не влияет на расположение строки состояния (рамка / высота / перекрытие). Также важно отметить, что строка состояния системы больше не имеет цвета фона. Когда API ссылается на UIStatusBarStyleLightContent, они означают белый текст на чистом фоне. UIStatusBarStyleDefault - черный текст на чистом фоне.
Внешний вид строки состояния контролируется по одному из двух взаимоисключающих базовых путей: вы можете либо установить их программным способом традиционным способом, либо UIKit обновит внешний вид для вас на основе некоторых новых свойств UIViewController. Последний вариант включен по умолчанию. Проверьте значение plist вашего приложения для «Внешний вид строки состояния на основе ViewController», чтобы увидеть, какой из них вы используете. Если для этого значения задано значение YES, каждый контроллер представления верхнего уровня в вашем приложении (кроме стандартного контроллера представления контейнера UIKit) должен переопределить предпочитаемыйStatusBarStyle, возвращая либо стиль по умолчанию, либо стиль освещения. Если вы измените значение plist на NO, то вы можете управлять внешним видом строки состояния, используя знакомые методы UIApplication.
UINavigationController изменит высоту своего UINavigationBar до 44 или 64 точек, в зависимости от довольно странного и недокументированного набора ограничений. Если UINavigationController обнаруживает, что верхняя часть фрейма его вида визуально соприкасается с верхней частью его UIWindow, тогда он рисует свою панель навигации с высотой 64 точки. Если его вершина не соприкасается с вершиной окна UIWindow (даже если она отклонена только на одну точку), тогда она рисует свою навигационную панель «традиционным» способом с высотой 44 точки. Эта логика выполняется UINavigationController, даже если в иерархии контроллера представления вашего приложения есть несколько дочерних элементов. Нет способа предотвратить такое поведение.
Если вы предоставляете пользовательское фоновое изображение панели навигации высотой всего 44 точки (88 пикселей) и границы представления UINavigationController совпадают с границами UIWindow (как описано в # 4), UINavigationController будет рисовать ваше изображение в кадре (0,20,320 , 44), оставляя 20 точек непрозрачного черного пространства над вашим изображением. Это может сбить вас с толку, если вы думаете, что вы умный разработчик, который обошел правило № 1, но вы ошибаетесь. Панель навигации по-прежнему 64 балла. Внедрение UINavigationController в иерархию представлений стиля со слайдом для раскрытия делает это совершенно ясным.
Остерегайтесь запутанно названного свойстваdgeForExtendedLayout UIViewController. Регулировка edgeForExtendedLayout ничего не делает в большинстве случаев. Единственный способ, которым UIKit использует это свойство, - это если вы добавляете контроллер представления в UINavigationController, тогда UINavigationController использует edgeForExtendedLayout, чтобы определить, должен ли его дочерний контроллер представления быть видимым под областью панели навигации / строки состояния. Установка edgeForExtendedLayout в самом UINavigationController не влияет на то, имеет ли UINavigationController область навигации с 44 или 64 точками. Смотрите # 4 для этой логики. Подобная логика компоновки применяется к нижней части вашего представления при использовании панели инструментов или UITabBarController.
Если все, что вы пытаетесь сделать, - это не допустить, чтобы ваш пользовательский дочерний контроллер представления перекрывал панель навигации, когда внутри UINavigationController, тогда задайте дляdgeForExtendedLayout значение UIRectEdgeNone (или, по крайней мере, маску, исключающую UIRectEdgeTop). Установите это значение как можно раньше в жизненном цикле вашего контроллера представления.
UINavigationController и UITabBarController также попытаются дополнить contentInsets табличных представлений и коллекционных представлений своей иерархией подпредставлений. Это происходит аналогично логике строки состояния из # 4. Существует программный способ предотвратить это, автоматически устанавливая AdjustsScrollViewInsets в NO для ваших табличных представлений и представлений коллекции (по умолчанию YES). Это создает некоторые серьезные проблемы для Whisper и Riposte, поскольку мы используем настройки contentInset для управления макетом табличных представлений в ответ на движения панели инструментов и клавиатуры.
Повторим: нет способа вернуться к логике макета строки состояния в стиле iOS 6. Чтобы приблизиться к этому, вы должны переместить все контроллеры представления вашего приложения в представление контейнера, которое смещено на 20 точек от верхней части экрана, оставляя намеренно черный вид за строкой состояния для имитации старого вида. Это метод, который мы в конечном итоге использовали в Riposte и Whisper.
Apple очень старается, чтобы вы не пытались сделать № 9. Они хотят, чтобы мы изменили дизайн всех наших приложений, чтобы перекрыть строку состояния. Однако существует множество убедительных аргументов как по пользовательскому опыту, так и по техническим причинам, почему это не всегда хорошая идея. Вы должны делать то, что лучше для ваших пользователей, а не просто следовать прихоти платформы.
источник
По-видимому, нет способа вернуть строку состояния iOS7 обратно к тому, как она работает в iOS6.
Тем не менее, мы всегда можем написать некоторые коды и превратить строку состояния в iOS6-подобный, и это самый короткий способ, который я могу придумать:
Набор
UIViewControllerBasedStatusBarAppearance
дляNO
вinfo.plist
(Чтобы отказаться от того, просматривать контроллеры настроить стиль строки состояния , так что мы можем задать стиль строки состояния с помощью метода UIApplicationstatusBarStyle.)В AppDelegate
application:didFinishLaunchingWithOptions
, позвонитечтобы:
Проверьте, если это iOS 7.
Установите содержимое строки состояния белым, в отличие от UIStatusBarStyleDefault.
Избегайте подпредставлений, чьи рамки выходят за пределы видимых границ (для видов, анимируемых в основной вид сверху).
Создайте иллюзию, что строка состояния занимает место, как в iOS 6, сместив и изменив размер окна приложения.
Для приложений с поворотом экрана
используйте NSNotificationCenter для обнаружения изменений ориентации путем добавления
в
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
и создать новый метод в AppDelegate:Чтобы при изменении ориентации он вызывал оператор switch для определения ориентации экрана приложения («Портрет», «Перевернутый вниз», «Пейзаж влево» или «Пейзаж вправо») и соответственно изменял рамку окна приложения, создавая иллюзию строки состояния iOS 6.
Чтобы изменить цвет фона строки состояния:
Добавить
в ,
AppDelegate.h
чтобы сделатьbackground
свойство в классе и предотвратить ARC от deallocating его. (Вам не нужно делать это, если вы не используете ARC.)После этого вам просто нужно создать UIWindow в
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
:Не забудьте
@synthesize background;
после@implementation AppDelegate
!источник
Я решил проблему с помощью следующего кода. Это для добавления строки состояния. didFinishLaunchingWithOptionsИ для Интерфейсного Разработчика это для, когда вы открываете с iOS 6; это начинается с 0 пикселей.Примечание. Дельты iOS 6/7 появляются только в том случае, если вы сняли флажок «Использовать автоматическое расположение» для контроллера вида в «Инспекторе файлов» (крайний левый значок) в области сведений.источник
РЕШЕНИЕ :
Установите его в вашем viewcontroller или в rootviewcontroller, переопределив метод:
источник
Вот еще один подход для проектов, которые широко используют раскадровку:
ЦЕЛЬ:
Цель этого подхода - воссоздать тот же стиль строки состояния в iOS7, который был в iOS6 (см. Заголовок вопроса «Строка состояния iOS 7 Вернуться к стилю iOS 6»).
РЕЗЮМЕ:
Чтобы добиться этого, мы максимально используем раскадровку, смещая элементы пользовательского интерфейса, которые перекрываются строкой состояния (под iOS 7), вниз, в то время как с помощью дельт-страниц можно отменить изменение макета вниз для iOS 6.1 или более ранней версии. Получающееся дополнительное пространство в iOS 7 затем занято UIView с backgroundColor, установленным в цвет по нашему выбору. Последний может быть создан в коде или с помощью раскадровки (см. АЛЬТЕРНАТИВЫ ниже)
Предположения:
Чтобы получить желаемый результат при выполнении следующих действий, предполагается, что для
View controller-based status bar appearance
него задано значение NO, аStatus bar style
для параметра «Прозрачный черный стиль (альфа из 0,5)» или «Непрозрачный черный стиль». Обе настройки можно найти / или добавить в разделе «Информация» в настройках вашего проекта.ШАГИ:
Добавьте в UIWindow подпредставление, которое будет использоваться в качестве фона строки состояния. Чтобы добиться этого, добавьте следующее в свой AppDelegate
application: didFinishLaunchingWithOptions:
послеmakeKeyAndVisible
Поскольку вы программно добавили фон ТОЛЬКО для iOS 7, вам придется соответствующим образом настроить макет элементов пользовательского интерфейса, которые перекрываются строкой состояния, при этом сохраняя их макет для iOS6. Для этого сделайте следующее:
Use Autolayout
для вашей раскадровки не выбрано (это потому, что в противном случае «iOS 6/7 Deltas» не отображается в Инспекторе размеров). Сделать это:АЛЬТЕРНАТИВЫ:
Чтобы добавить еще меньше кода в проекты, насыщенные раскадровкой, и иметь автоматический фоновый режим строки состояния, вместо программного добавления фона для строки состояния, вы можете добавить цветное представление к каждому контроллеру представления, который находится в самом верху основного вида указанного viewcontroller. Затем вы изменили бы дельту высоты этого нового вида на ту же отрицательную величину, что и высота вашего вида (чтобы она исчезла в iOS 6).
Недостатком этой альтернативы (хотя, возможно, она и незначительна, учитывая совместимость с автоматическим поворотом) является тот факт, что это дополнительное представление не сразу видно, если вы просматриваете раскадровку для iOS 6. Вы бы знали, что оно есть, если вы посмотрите на " Схема документа "Раскадровка.
источник
Если вы не хотите, чтобы ваши контроллеры представления перекрывались строкой состояния (и панелями навигации), снимите флажок «Расширить края под верхними панелями» в Интерфейсном Разработчике в Xcode 5.
источник
Apple выпустила Технический Q & A QA1797: не позволяя строке состояния скрывать ваши взгляды . Он отлично работает для версий iOS 6 и iOS 7.
источник
Я просмотрел много-много-много-много уроков, чтобы решить эту чертову проблему. Но ни один из них не работает! Вот мое решение, и оно работает для меня:
Логика проста. Я перевожу все дочерние представления на self.view с 20 пикселями. Вот и все. Затем скриншот будет отображаться так же, как и iOS 6. Я ненавижу строку состояния iOS7! ~ "~
источник
Небольшая альтернатива ответу Арчи Холта, немного более простая:
а. Набор
UIViewControllerBasedStatusBarAppearance
дляNO
в info.plistб. В
AppDelegate
хapplication:didFinishLaunchingWithOptions:
, звоните:И добавьте метод:
Вы можете также рассмотреть подклассы
UIWindow
для обработкиUIApplicationDidChangeStatusBarOrientationNotification
себя.источник
Я использовал это во всех моих контроллерах представления, это просто. Добавьте эти строки во все ваши методы viewDidLoad:
источник
Попробуйте этот простой метод ....
Шаг 1 : Чтобы изменить в одиночном
viewController
Шаг 2 : изменить во всем приложении
Шаг 3 : также добавьте это в каждый,
viewWillAppear
чтобы отрегулироватьstatusbar
высоту дляiOS7
источник
В Интерфейсном Разработчике есть опция, которая вызывает свойство iOS 6/7 Delta, которое направлено на решение проблемы смещения.
Взгляните на это в вопросе переполнения стека Интерфейсный конструктор: для чего нужны UIView's Layout iOS 6/7 Delta? ,
источник
Я достиг строки состояния, как iOS 6 в iOS 7.
Установите для UIViewControllerBasedStatusBarAppearance значение NO в info.plist
Вставить этот код в
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
методЭто может оттолкнуть все ваши просмотры на 20 пикселей. Чтобы прийти, используйте следующий
-(void)viewDidAppear:(BOOL)animated
метод в методеВы должны установить значение WindowHeight Userdefaults после выделения окна в методе didFinishLauncing, например:
источник
height
равнялся 64 вместо 44. Тогда ваша полоса будет расширяться до вершины, как в приложениях Apple.Если вы используете конструктор интерфейса, попробуйте это:
В вашем XIB-файле:
1) Выберите основной вид, установите цвет фона на черный (или любой другой цвет, который вы хотите, чтобы строка состояния была
2) Убедитесь, что фон является автономным подпредставлением, расположенным как дочерний элемент верхнего уровня представления контроллера.
Переместите фон, чтобы стать прямым потомком зрения контроллера. Проверьте панель автоматического изменения размера, чтобы убедиться, что вы заблокировали все края рамки, активировали обе оси гибкости, и, если это UIImageView, установите для режима содержимого значение Масштаб, чтобы заполнить. Программно это преобразуется в contentMode, установленный в UIViewContentModeScaleToFill, и имеет его маску автоматического изменения размера (UIViewAutoresizingFurableWidth | UIViewAutoresizingF FlexibleHeight).
3) Теперь переместите все, что заблокировано, сверху вниз - на 20 пунктов и установите для iOS 6/7 delta Y значение -20.
Все дочерние элементы верхнего уровня, которые привязаны к верхнему фрейму на панели автоматического изменения размера, должны быть сдвинуты вниз на 20 пунктов, и для их iOS 6/7 delta Y должно быть установлено значение -20. (Cmd выберите все из них и нажмите стрелку вниз 20 раз - есть ли лучший способ для кого-либо?)
4) Отрегулируйте iOS 6/7 высоту дельты всех вышеупомянутых элементов, которые имели гибкую высоту. Для любого из элементов, которые были заблокированы в верхней и нижней части рамки и на панели автоматического изменения размера включена гибкая высота, также должна быть установлена высота треугольника iOS 6/7, равная 20. Это включает фоновое представление, упомянутое выше. Это может показаться антиинтуитивным, но из-за порядка, в котором они применяются, это необходимо. Сначала задается высота кадра (в зависимости от устройства), затем применяются дельты, и, наконец, маски авторазмера применяются на основе позиций смещения всех дочерних кадров - подумайте немного, это будет иметь смысл.
5) Наконец, элементы, которые были привязаны к нижней рамке, но не к верхней рамке, вообще не нуждаются в дельтах.
Это даст вам одинаковую строку состояния в iOS7 и iOS6.
С другой стороны, если вы хотите стилизацию под iOS7 при сохранении совместимости с iOS6, тогда установите значения delta Y / delta height равными 0 для фона.
Чтобы увидеть больше информации о переходе на iOS7, прочитайте полный пост: http://uncompiled.blogspot.com/2013/09/legacy-compatible-offsets-in-ios7.html
источник
Моим решением было добавить
UIView
высоту 20 точек в верхней части окна в iOS 7. Затем я создал метод в своем классе AppDelegate, чтобы показать / скрыть «сплошной» фон строки состояния. Вapplication:didFinishLaunchingWithOptions:
:Затем я создал метод постепенного увеличения / уменьшения черного фона строки состояния:
Все, что мне нужно сделать сейчас, это позвонить,
[appDelegate showSolidStatusBar:YES]
когда это необходимо.источник
Это может быть огромной проблемой, если вы используете Auto layout, потому что вы больше не можете напрямую манипулировать кадрами. Есть простое решение без лишней работы.
В итоге я написал вспомогательный метод в Utility Class и вызвал его из всех
viewDidLayoutSubviews
методов контроллеров представления .Переопределите свой
viewDidLayoutSubviews
метод в контроллере представления, где вы хотите строку состояния. Это поможет вам пережить бремя автопоставки.источник
Самый простой способ сделать это - установить старый SDK на свой новейший Xcode.
Как установить более старый SDK на новейший Xcode?
Вы можете получить iOS 6.1 SDK с http://www.4shared.com/zip/NlPgsxz6/iPhoneOS61sdk.html или загрузить старый Xcode и получить SDK из его содержимого.
Разархивируйте и вставьте эту папку в /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs
Перезапустите xcode.
Надеюсь, это поможет вам. У меня это сработало =)
источник
Что касается использования
presentViewController:animated:completion:
беспорядкаwindow.rootViewController.view
, мне пришлось найти другой подход к этой проблеме. Наконец-то я получил его для работы с модальностями и вращениями, создав подкласс UIView моего rootViewController..час
.m
Теперь у вас есть сильный обходной путь для анимации iOS7.
источник
Я опаздываю на этот ответ, но я просто хочу поделиться тем, что я сделал, что в принципе является самым простым решением
Прежде всего -> Перейдите в свой
info.plist
Файл и добавьте Стиль строки состояния-> Прозрачный черный стиль (Альфа 0.5)Теперь вот оно:
Добавьте этот код в свой AppDelegate.m
источник
Мое очень простое решение (при условии, что поддерживается только вертикальная ориентация) состоит в том, чтобы переопределить границы окна приложения для версий iOS ниже 7 в методе делегата приложения didFinishLaunchingWithOptions:
источник
Вы можете скрыть строку состояния все вместе. Так что ваше приложение будет полноэкранным. Я думаю, что это лучшее, что вы получите.
UIStatusBarStyleNone
или установите в настройках цели.источник
Шаги для скрытия строки состояния в iOS 7:
1. Перейдите в файл info.plist вашего приложения.
2.И установить, просмотреть внешний вид строки состояния контроллера: Boolean NO
Надеюсь, я решил проблему в строке состояния .....
источник
Чтобы продолжить работу с setStatusBarHidden: я использую эту категорию:
источник
Я нашел здесь лучшие альтернативы и решения для этой проблемы панели навигации в iOS7!
http://www.appcoda.com/customize-navigation-status-bar-ios-7/
Я надеюсь, что это очистит все наши вопросы и заботы.
источник
Это может быть слишком поздно, чтобы поделиться, но у меня есть кое-что, что могло бы помочь кому-то, я пытался подразделить UINavigationBar и хотел сделать его похожим на ios 6 с черной строкой состояния и текстом строки состояния в белом.
Вот что я нашел для этого
Это сделало мой фон строки состояния черным, текст строки состояния белым, а цвет панели навигации - белым.
iOS 9.3, XCode 7.3.1
источник