Интерфейс пользовательского интерфейса 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