it-swarm.com.ru

Строка состояния и навигационная панель проблема в IOS7

Я переношу свое приложение на iOS 7. Для решения проблемы в строке состояния я добавил этот код

if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f)
{
    CGRect frame = self.navigationController.view.frame;
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    {
        frame.Origin.y = 20;
    }
    else
    {
        frame.Origin.x = 20;
    }
    [self.navigationController.view setFrame:frame];
}

Это нормально работает в нормальном случае. Если я меняю ориентацию (приложение поддерживает только альбомную ориентацию) или представляю какой-либо контроллер вида и отклоняю контроллер вида модели, моё выравнивание контроллера вида изменилось. Строка состояния снова перекрывает мой контроллер просмотра. Этот кусок кода не работает вообще. Пожалуйста, помогите мне исправить эту проблему в строке состояния.

Случай 2: так я представляю свой контроллер вида

ZBarReaderViewController *reader = [ZBarReaderViewController new];
reader.readerDelegate = self;

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    reader.supportedOrientationsMask = ZBarOrientationMaskLandscape;
else
    reader.supportedOrientationsMask = ZBarOrientationMaskPortrait;

    [self presentModalViewController:reader animated:YES];

Ref:

enter image description here

Заранее спасибо.

57
Ganapathy

Исправлена ​​проблема со строкой состояния в IOS 7

Наконец, я исправил проблему состояния строки в коленях, используя свойство delta value в xcode5. Сначала у меня есть увеличил Origin - y 20pxl для всех контроллеров, используемых в Xib (кажется, что он работает нормально только в IOS 7), после этого я установите Дельта-значение для всех контроллеров представления Origin -y до -20 прекрасно работает как в ios 6, так и в IOS 7.

Шаги, чтобы сделать это.

Xcode 5 предоставляет возможность предварительного просмотра для просмотра внешнего вида xib в другом представлении в зависимости от версии ОС.

выберите опцию предварительного просмотра из помощника редактора

нажмите помощник редактора

enter image description here

и выберите опцию предварительного просмотра, чтобы просмотреть выбранный контроллер представления в другой версии. enter image description here

просмотр контроллера просмотр предварительного просмотра.

enter image description here

в предварительном просмотре вы можете найти опцию переключения для просмотра в другой версии. В предварительном просмотре вы можете ясно почувствовать проблему строки состояния, если она не исправлена ​​должным образом, переключая версию.

Три шага, чтобы исправить проблему в строке состояния: шаг 1: Убедитесь, что просмотрите целевую версию 7.0 и более поздние в Инспекторе файловenter image description here

Шаг 2: Увеличьте Origin - y с 20 пикселями (точно размер строки состояния) для всех элементов управления, добавленных в контроллер представления.

Шаг 3: Установите дельта-значение Origin y на -20 для всех элементов управления, тогда только оно будет корректироваться автоматически в зависимости от версии. Используйте предварительный просмотр сейчас и почувствуйте разницу, которую элементы управления автоматически корректируют из-за значения дельты. enter image description here

Как только проблема в строке состояния устранена, проблема при представлении модели (контроллер ZbarSDk) также устраняется автоматически.

Экран предварительного просмотра:

enter image description here

132
Ganapathy

Я опоздал на этот ответ, но я просто хочу поделиться тем, что я сделал, что в основном
самое простое решение

Первый из всех-> Перейдите к своему info.plist File и добавьте Стиль строки состояния-> Прозрачный черный стиль (Альфа 0,5)

Теперь вот оно:

Добавьте этот код в свой AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
     //Whatever your code goes here
  if(kDeviceiPad){

     //adding status bar for IOS7 ipad
         if (IS_IOS7) {
              UIView *addStatusBar = [[UIView alloc] init];
              addStatusBar.frame = CGRectMake(0, 0, 1024, 20);
              addStatusBar.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; //change this to match your navigation bar
              [self.window.rootViewController.view addSubview:addStatusBar];
                    }
                }
    else{

         //adding status bar for IOS7 iphone
        if (IS_IOS7) {
            UIView *addStatusBar = [[UIView alloc] init];
            addStatusBar.frame = CGRectMake(0, 0, 320, 20);
            addStatusBar.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; //You can give your own color pattern
            [self.window.rootViewController.view addSubview:addStatusBar];
        }

    return YES;
   }
15
Vizllx
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];

    self.window.rootViewController = self.viewController;

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {

        [application setStatusBarStyle:UIStatusBarStyleLightContent];
         [application setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];

        self.window.clipsToBounds =YES;            
        self.window.frame =CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20);
    }


   [self.window makeKeyAndVisible];
    return YES;
}

установите следующее в info.plist

Просмотреть внешний вид строки состояния на основе контроллера = НЕТ;

6
John

Слушайте, мы можем сделать это для всех просмотров одновременно

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
// Notification for the orientaiton change
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(applicationDidChangeStatusBarOrientation:)
                                             name:UIApplicationDidChangeStatusBarOrientationNotification
                                           object:nil];

// Window framing changes condition for iOS7 or greater
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    statusBarBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, -20, self.window.frame.size.width, 20)];//statusBarBackgroundView is normal uiview
    statusBarBackgroundView.backgroundColor = [UIColor colorWithWhite:0.000 alpha:0.730];
    [self.window addSubview:statusBarBackgroundView];
    self.window.bounds = CGRectMake(0, -20, self.window.frame.size.width, self.window.frame.size.height);
}
// Window framing changes condition for iOS7 or greater

self.window.rootViewController = navigationController;
[self.window makeKeyAndVisible];


return YES;
}

И хотя мы используем ориентацию, мы можем добавить ниже метод в делегат приложения, чтобы установить его через ориентацию.

- (void)applicationDidChangeStatusBarOrientation:(NSNotification *)notification
{
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    statusBarBackgroundView.hidden = YES;
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
    int width = [[UIScreen mainScreen] bounds].size.width;
    int height = [[UIScreen mainScreen] bounds].size.height;

    switch (orientation) {
        case UIInterfaceOrientationLandscapeLeft:
            self.window.bounds =  CGRectMake(-20,0,width,height);
            statusBarBackgroundView.frame = CGRectMake(-20, 0, 20, height);
            break;
        case UIInterfaceOrientationLandscapeRight:
            self.window.bounds =  CGRectMake(20,0,width,height);
            statusBarBackgroundView.frame = CGRectMake(320, 0, 20, height);
            break;
        case UIInterfaceOrientationPortraitUpsideDown:
            statusBarBackgroundView.frame = CGRectMake(0, 568, width, 20);
            self.window.bounds =  CGRectMake(0, 20, width, height);
            break;
        default:
            statusBarBackgroundView.frame = CGRectMake(0, -20, width, 20);
            self.window.bounds =  CGRectMake(0, -20, width, height);
            break;
    }
    statusBarBackgroundView.hidden = NO;
}
}

Вы должны добавить ниже категорию контроллера навигации для него

.час

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
@interface UINavigationController (iOS6fix)

@end

.m

#import "UINavigationController+iOS6fix.h"
@implementation UINavigationController (iOS6fix)  

-(BOOL)shouldAutorotate
{
      return [[self.viewControllers lastObject] shouldAutorotate];
}

-(NSUInteger)supportedInterfaceOrientations
{
      return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
     return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}

@end
3
sinh99

НАМНОГО НАМНОГО более простого ответа:

Выровняйте верхнюю часть вашего вида с "руководством по верхнему макету", но перетаскиванием элемента управления "Верхнее руководство по макету" перетащите его в свой вид и установите ограничение "по вертикали". см. Этот ответ для ссылки на изображение.

Это работает так: "Руководство по верстке" автоматически настраивает себя на наличие или отсутствие строки состояния, и все будет работать - кодирование не требуется!

Постскриптум В этом конкретном примере фон, просвечивающий внизу, также должен быть разрешен путем установки соответствующего вертикального ограничения нижней части вида, его суперпредставления или чего-либо еще ...

3
Brad

Чтобы скрыть строку состояния в ios7, выполните следующие простые шаги:

В Xcode перейдите в папку "Resources" и откройте "(app name)-Info.plist file".

  • проверьте ключ "View controller based status bar appearance" и установите его значение "NO"
  • проверьте ключ "Status bar is initially hidden" и установите его значение "YES"

Если ключей там нет, вы можете добавить их, выбрав "information property list" вверху и нажав значок +

3
Mandeep Pasbola

я решил это с помощью приведенного ниже кода

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 {
    if(landScape mode)

       if ([UIDevice currentDevice].systemVersion.floatValue>=7) {
        CGRect frame = self.window.frame;
       frame.size.width -= 20.0f;
      frame.Origin.x+= 20.0f;
       self.window.frame = frame;
    }


 if(portrait)

    if ([[[UIDevice currentDevice]systemVersion]floatValue] >= 7.0) {
    [application setStatusBarStyle:UIStatusBarStyleLightContent];

    CGRect frame = self.window.frame;
    frame.Origin.y += 20.0f;
    frame.size.height -= 20.0f;
    self.window.frame = frame;
}
return YES;

 }
1
user2230971
#define _kisiOS7 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)

 if (_kisiOS7)
    {
        [[UINavigationBar appearance] setBarTintColor:_kColorFromHEX(@"#011C47")];
    }
    else
    {
        [[UINavigationBar appearance] setBackgroundColor:_kColorFromHEX(@"#011C47")];
        [[UINavigationBar appearance] setTintColor:_kColorFromHEX(@"#011C47")];
    }
1
Mubin Shaikh

просто установите следующий код в viewWillAppear.

 if ([[[UIDevice currentDevice] systemVersion] floatValue]<= 7) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
 }
1
Amit Shelgaonkar

В Salesforce SDK 2.1 (Cordova 2.3.0) нам пришлось сделать следующее, чтобы строка состояния отображалась при начальной загрузке приложения и возвращалась из фона (iPhone и iPad):

Вопреки другим решениям, опубликованным здесь, это, кажется, переживает вращение устройства.

1 -Создать категорию из SFHybridViewController

#import "SFHybridViewController+Amalto.h"

@implementation SFHybridViewController (Amalto)

- (void)viewWillAppear:(BOOL)animated
    {
        //Lower screen 20px on ios 7
        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
            CGRect viewBounds = self.view.bounds;
            viewBounds.Origin.y = 20;
            viewBounds.size.height = viewBounds.size.height - 20;
            self.webView.frame = viewBounds;
        }

    [super viewWillAppear:animated];
    }

    - (void)viewDidLoad
    {

        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
            CGRect viewBounds = self.view.bounds;
            viewBounds.Origin.y = 20;
            viewBounds.size.height = viewBounds.size.height - 20;
            self.webView.frame = viewBounds;
        }
        [super viewDidLoad];
    }

@end

2 -Добавить к AppDelegate.m импортам

#import "SFHybridViewController+Amalto.h"

3 -Вставить в конце метода didFinishLaunchingWithOptions из AppDelegate

//Make the status bar appear
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {

    [application setStatusBarStyle:UIStatusBarStyleLightContent];
    [application setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];
}

4 -Добавить в App-Info.plist свойство

View controller-based status bar appearance со значением NO

0
Bruno Grieder

Есть несколько разных способов. Одним из подходов является использование файла .plist

  • Добавьте новый ключ "Просмотреть внешний вид строки состояния на основе контроллера" и установите значение "NO".
  • Добавьте еще один ключ "строка состояния изначально скрыта" и установите значение как "YES".

Это скроет строку состояния на протяжении всего проекта.

Screenshot for approach

0
Jayprakash Dubey