Интерфейс пользовательского интерфейса iOS 7
Недавно я обновился до xcode 5, и когда я запустил свое приложение в iOS-симуляторе, экран заставки перекрывает строку состояния, а когда вы находитесь в приложении, панель состояния перекрывается на элементы в моем приложении, например, на кнопке "Назад", в верхнем левом углу моего приложения. Я создаю свое приложение с помощью phonegap 2.9. Любые идеи, как я могу заставить это правильно отобразить.
![splashscreen]()
![UI]()
Ответы
Ответ 1
Вы можете решить эту проблему, если используете раскадровки, как в этом вопросе: iOS 7 - Строка состояния перекрывает представление
Если вы не используете раскадровку, вы можете использовать этот код в своем AppDelegate.m
в did finishlaunching
:
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
[application setStatusBarStyle:UIStatusBarStyleLightContent];
self.window.clipsToBounds =YES;
self.window.frame = CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20);
}
Также см. этот вопрос: Строка состояния и проблема с навигационной панелью в IOS7
Ответ 2
В MainViewController.m внутри: - (void)viewWillAppear:(BOOL)animated
добавьте это:
//Lower screen 20px on ios 7
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
CGRect viewBounds = [self.webView bounds];
viewBounds.origin.y = 18;
viewBounds.size.height = viewBounds.size.height - 18;
self.webView.frame = viewBounds;
}
поэтому конечная функция будет выглядеть так:
- (void)viewWillAppear:(BOOL)animated
{
// View defaults to full size. If you want to customize the view size, or its subviews (e.g. webView),
// you can do so here.
//Lower screen 20px on ios 7
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
CGRect viewBounds = [self.webView bounds];
viewBounds.origin.y = 18;
viewBounds.size.height = viewBounds.size.height - 18;
self.webView.frame = viewBounds;
}
[super viewWillAppear:animated];
}
Ответ 3
Что я обычно делаю, так это добавить два свойства ключа в файл Info.plist
.
![enter image description here]()
Исходный код свойств:
![enter image description here]()
Ответ 4
У меня проблема с открытием браузера inApp с телефонной связью. Gimi fix работал хорошо, но каждый раз, когда я открывал браузер inApp, экран был сжат внизу. Поэтому я добавил оператор if, чтобы проверить, было ли происхождение webview y 0. В браузере inApp больше нет y-источника 0, поэтому он решил мою проблему.
// ios 7 status bar fix
- (void)viewWillAppear:(BOOL)animated
{
// View defaults to full size. If you want to customize the view size, or its subviews (e.g. webView),
// you can do so here.
//Lower screen 20px on ios 7
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
if(self.webView.frame.origin.y == 0) {
CGRect viewBounds = [self.webView bounds];
viewBounds.origin.y = 20;
viewBounds.size.height = viewBounds.size.height - 20;
self.webView.frame = viewBounds;
}
}
[super viewWillAppear:animated];
}
Решение на самом деле не мое, но я не могу найти источник. Надеюсь, это поможет!
Ответ 5
Поместите этот фрагмент кода в свой MainViewController.m
файл в проект phonegap.
- (void)viewDidLayoutSubviews{
if ([self respondsToSelector:@selector(topLayoutGuide)]) // iOS 7 or above
{
CGFloat top = self.topLayoutGuide.length;
if(self.webView.frame.origin.y == 0){
// We only want to do this once, or
// if the view has somehow been "restored" by other code.
self.webView.frame = CGRectMake(self.webView.frame.origin.x,
self.webView.frame.origin.y + top,
self.webView.frame.size.width,
self.webView.frame.size.height-top);
}
}
}
Ответ 6
Я использую этот код в методе ViewDidLoad.
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
{
self.edgesForExtendedLayout = UIRectEdgeNone;
}
Это работает при попытке поддерживать предыдущие версии iOS.
Ответ 7
Если вы разрабатываете iOS 7, я бы не рекомендовал обертывать строку состояния черным прямоугольником старого стиля iOS. Просто интегрируйте его в дизайн для более полноэкранного просмотра iOS 7.
Вы можете использовать этот плагин для настройки цвета чернил в строке состояния или скрыть его или показать его в любом случае вашего приложения.
https://github.com/jota-v/cordova-ios-statusbar
Методы js:
window.plugins.statusBar.hide();
window.plugins.statusBar.show();
window.plugins.statusBar.blackTint();
window.plugins.statusBar.whiteTint();
ВАЖНО: Также в вашем файле plist файла установите UIViewControllerBasedStatusBarAppearance
на НЕТ.
Ответ 8
На самом деле, я нашел ответ Гими, чтобы быть лучшим ответом, и я много искал!
Просто добавьте ответ Gimi, а также ответьте на ответный ответ на этот ответ. Код будет выполняться всякий раз, когда появляется представление, что означает, что после закрытия встроенного браузера или после рулона камеры и т.д., Поэтому я просто добавляю значение bool, указывающее был ли размер уже настроен.
Окончательный код выглядит следующим образом:
bool sizeWasAdjusted = false;
- (void)viewWillAppear:(BOOL)animated
{
// View defaults to full size. If you want to customize the view size, or its subviews (e.g. webView),
// you can do so here.
//Lower screen 20px on ios 7
if (!sizeWasAdjusted && [[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
CGRect viewBounds = [self.webView bounds];
viewBounds.origin.y = 18;
viewBounds.size.height = viewBounds.size.height - 18;
self.webView.frame = viewBounds;
sizeWasAdjusted = true;
}
[super viewWillAppear:animated];
}
Ответ 9
Попробуйте войти в файл приложения (app name)-Info.plist
в XCode и добавьте ключ
view controller-based status bar appearance: NO
status bar is initially hidden : YES
Кажется, это работает для меня без проблем.
Ответ 10
Лучше иметь это в info.plist
<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
это не делает строку состояния вообще.
Ответ 11
Чтобы решить проблему строки состояния iOS7, мы можем использовать следующий код для Кордовы /PhoneGap:
function onDeviceReady() {
if (parseFloat(window.device.version) === 7.0) {
document.body.style.marginTop = "20px";
}
}
document.addEventListener('deviceready', onDeviceReady, false);
В любом случае Cordova 3.1 скоро исправит эту и другие проблемы для iOS7.
Ответ 12
Из Руководство по переходу Apple iOS7,
В частности,
self.automaticallyAdjustsScrollViewInsets = YES;
self.edgesForExtendedLayout = UIRectEdgeNone;
работает для меня, когда я не хочу перекрываться, и у меня есть UITableViewController.
Ответ 13
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
self.window.clipsToBounds =YES;
[application setStatusBarStyle:UIStatusBarStyleLightContent];
self.window.frame = CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20);
}
Ответ 14
Если вы используете Cordova с Sencha Touch, и вы используете обычные навигационные/заголовковые полосы Sencha Touch, вы можете просто растянуть навигационную панель и переместить содержимое в навигационной панели, чтобы она выглядела как дома на iOS 7. Просто добавьте это в app.js
(после вашей последней строки Ext.Viewport.add
):
// Adjust toolbar height when running in iOS to fit with new iOS 7 style
if (Ext.os.is.iOS && Ext.os.version.major >= 7) {
Ext.select(".x-toolbar").applyStyles("height: 62px; padding-top: 15px;");
}
(Источник: http://lostentropy.com/2013/09/22/ios-7-status-bar-fix-for-sencha-touch-apps/)
Это немного взломанный, я знаю, но он справляется с этим на уровне Objective-C. Это будет не очень хорошо для тех, кто не использует Sencha Touch с Кордовой.
Ответ 15
Введите следующий код внутри AppDelegate.m в событии didFinishLaunchingWithOptions (прямо перед его последней строкой кода вернуть YES; "):
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7)
{
[application setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
}
Я буду ждать ваших отзывов!:)
Ответ 16
В свойство набора .plist:
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
Он скрывает statusBar.
Ответ 17
Лучшим подходом, который вы можете использовать, является изменение размера основного вида, особенно если ваше приложение использует нижний колонтитул.
в MainViewController.m, используя метод viewDidLoad, после [super viewDidLoad];
NSArray *vComp = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];
if ([[vComp objectAtIndex:0] intValue] >= 7) {
// iOS 7 or above
CGRect oldBounds = [self.view bounds];
CGRect newViewBounds = CGRectMake( 0, -10, oldBounds.size.width, oldBounds.size.height-20 );
CGRect newWebViewBounds = CGRectMake( 0, -20, oldBounds.size.width, oldBounds.size.height-40 );
[self.view setBounds:newViewBounds];
[self.webView setBounds:newWebViewBounds];
}
вам не нужно будет изменять какой-либо javascript в вашем приложении
Ответ 18
Я начал идти по этому маршруту, но у меня есть собственный навигационный элемент управления с core view
, который я вставляю в кадр, который обычно обертывает ядро общей строкой заголовка и tabbar
; no storyboard
, no UINavigationController
.
Он начал быстро усложняться, добавляя и вычитая 20 пикселей строки состояния. Затем прозрение.
Я сделал копию .xib file
, сказал Xcode
, чтобы показать его мне как макет iOS 7, перестроил все и поместил один переключатель 6/7 в код.. мгновенно все работает правильно, и дополнительные ресурсы добавляют только 8K к набору.
Ответ 19
С выпуском iOS 7.0.4 исправление iOS7 сломалось в моем текущем проекте, так как 7.0.4 работает без исправления.
Таким образом, добавлен незначительный элемент управления, чтобы запустить его, если он запускает небольшую версию 3 или меньше.
NSArray *vComp = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];
if ([[vComp objectAtIndex:0] intValue] == 7 && [[vComp objectAtIndex:1] intValue] == 0 && [[vComp objectAtIndex:2] intValue] <= 3 ) {
CGRect oldBounds = [self.view bounds];
CGRect newViewBounds = CGRectMake( 0, -10, oldBounds.size.width, oldBounds.size.height-20 );
CGRect newWebViewBounds = CGRectMake( 0, -20, oldBounds.size.width, oldBounds.size.height-40 );
[self.view setBounds:newViewBounds];
[self.webView setBounds:newWebViewBounds];
}
Ответ 20
Мы также можем проверить это в наших js файлах
if (parseFloat(window.device.version) >= 7.0) {
$("body").addClass("ios7");
}
В файле .css определите класс для этого
.ios7 .ui-page, .ios7 .ui-header, .ios7 .ui-pane {
margin-top: 17px !important;
}
Ответ 21
Большое спасибо. Он отлично работал:
MAC OS X 10.9.1
- Xcode 5.0.2
- cordova 3.3
- jQuery mobile 1.3.2
.
Ответ 22
Сначала я разрабатываю для iOS7, но для того, чтобы поддерживать совместимость с iOS6, я делаю то же самое, что предложил Гими - в MainViewController.m
я установил y origin 20px вверх и увеличил высоту представления на 20px:
//Lower screen 20px on ios 7
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 7) {
CGRect viewBounds = [self.webView bounds];
viewBounds.origin.y = -20;
viewBounds.size.height = viewBounds.size.height + 20;
self.webView.frame = viewBounds;
}
Ответ 23
Вот мой подход с использованием CSS и Javascript:
1) Определите в своем CSS следующее:
#ios7-statusbar-fix {
width:100%;
height:20px;
background-color:white;
position:fixed;
z-index:10000;
margin-top:-20px;
display:none;
}
2) Добавьте div-контейнер с этим id как очень первый элемент после вашего <body>
-tag:
<body>
<div id="ios7-statusbar-fix"></div>
…
3) Отфильтруйте устройства iOS 7 и примените изменения через Javascript:
if (navigator.userAgent.match(/(iPad.*|iPhone.*|iPod.*);.*CPU.*OS 7_\d/i)) {
document.body.style.marginTop = '20px';
document.getElementById('ios7-statusbar-fix').style.display = 'block';
}
Ответ 24
Некоторые из вышеприведенных ответов дадут вам черную полосу сверху, если вы установите свой экран на 20 пикселей, другие будут продолжать уменьшать экран веб-просмотра, если вы используете webview.frame.size.height -20px;
Попробуйте это, тогда он работает на любых ios и не нужно менять css, вставлять внутри
- (void)webViewDidFinishLoad:(UIWebView*)theWebView {
//это IOS7 и up
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
//получить размер экрана устройства
CGRect screenBounds = [[UIScreen mainScreen] bounds];
//уменьшаем высоту на 20 пикселей
int x= screenBounds.size.height -20;
//установите верхний верх 20px для веб-просмотра, чтобы он находился под строкой состояния и уменьшил размер на 20 пикселей
[theWebView setFrame:CGRectMake(0, 20, theWebView.frame.size.width, x )];
}
Ответ 25
Для iPhoneX
Для всех ответов выше:
Высота строки состояния в iPhoneX 44, а не 20