Проблема с панелью навигации и строкой состояния в iOS 7

Я создал приложение, используя XIB без Status Bar раньше для iOS7, теперь мне нужно добавить Status bar в мое приложение, а Status bar background color должен совпадать с цветом фона Navigation bar. Итак, я пробовал так (в моем info.plist):

1) Set View controller-based status bar appearance to NO
2) Set Status bar style to UIStatusBarStyleLightContent 

вот мой код для App Delegate:

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];

[[UINavigationBar appearance] setBarStyle:UIBarStyleDefault];
[[UINavigationBar appearance] setBackgroundColor:[UIColor colorWithRed:(51/255.0) green:(51/255.0) blue:(51/255.0) alpha:1.0]];
[[UINavigationBar appearance] setBarTintColor:[UIColor colorWithRed:(51/255.0) green:(51/255.0) blue:(51/255.0) alpha:1.0]];

Итак, я получаю вывод, как на изображении ниже:

введите здесь описание изображения

также я получаю неправильное размещение UIButtons, которое я дал ниже на моем экране (он скрывает 20 пикселей).

Не могли бы вы помочь мне, как я могу решить эту проблему? Мне нужен мой вывод, как на изображении ниже:

введите здесь описание изображения

Любая помощь будет очень признательна, спасибо.

Третий экран:

введите здесь описание изображения


person user2786    schedule 30.06.2014    source источник
comment
Вы обрезаете до границы, а граница имеет origin.y 20px. Кажется, это проблема?   -  person danqing    schedule 30.06.2014
comment
@DanqingСпасибо, не могли бы вы сказать мне, какие изменения мне нужно сделать?   -  person user2786    schedule 30.06.2014
comment
Почему координата окна y указывается как 20?   -  person Naga Mallesh Maddali    schedule 30.06.2014
comment
ну, сначала удалить эти две строки, я думаю?   -  person danqing    schedule 30.06.2014
comment
Спасибо @NagaMalleshMaddali, теперь я удалил окно по координате y (20 пикселей) .. поэтому я получаю результат, как мое первое прикрепленное изображение, я обновил свой вопрос, пожалуйста, проверьте   -  person user2786    schedule 30.06.2014
comment
как разделить строку состояния и панель навигации? пожалуйста помогите мне..   -  person user2786    schedule 30.06.2014
comment
@DanqingМожете ли вы предложить мне?   -  person user2786    schedule 30.06.2014


Ответы (3)


Добавьте следующий код в свой метод viewDidLoad:

float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];

if (systemVersion >= 7.0) 
{
    self.edgesForExtendedLayout = UIRectEdgeNone;
}
person Naga Mallesh Maddali    schedule 30.06.2014
comment
Маллеш Маддали. Я добавил то же самое в свой метод viewDidLoad, но все же я получаю тот же результат, что и на изображении 1. Как разделить строку состояния и панель навигации? - person user2786; 30.06.2014
comment
Попробуйте удалить следующий код из AppDelegate: [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; [[UIApplication sharedApplication] setStatusBarHidden: NO withAnimation: UIStatusBarAnimationNone]; - person Naga Mallesh Maddali; 30.06.2014
comment
Спасибо @Naga, я удалил упомянутые строки .. теперь я получаю вывод без строки состояния. - person user2786; 30.06.2014
comment
Проверьте, добавив только эту строку: [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone]; - person Naga Mallesh Maddali; 30.06.2014
comment
После добавления этого .. я получаю вывод со строкой состояния в виде прикрепленного изображения 3. Пожалуйста, проверьте .. - person user2786; 30.06.2014
comment
@ user2786, попробуйте использовать решение UIBarPositioningDelegate из этого сообщения: stackoverflow.com/questions/18948505/. Я думаю, что ваша проблема из-за автоматического макета. - person Naga Mallesh Maddali; 30.06.2014
comment
Давайте продолжим обсуждение в чате. - person Naga Mallesh Maddali; 30.06.2014

Пожалуйста, определите это в AppDelegate.h (или) const.h

  #define isIOS7  ([[[UIDevice currentDevice]systemVersion]floatValue] >=7.0)?YES:NO

под viewDidLoad Напишите эти строки.

  if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
   UIView *addStatusBar = [[UIView alloc] init];
   addStatusBar.frame = CGRectMake(0, 0, 320, 20);
    addStatusBar.backgroundColor = [UIColor colorWithRed:0.973 green:0.973 blue:0.973 alpha:1];


     //change this to match your navigation bar
    [self.window.rootViewController.view addSubview:addStatusBar];
  }

ИЛИ мы можем изменить его вручную в xib.

Перемещая каждый элемент на 20 пикселей вниз.

Посмотреть это изображение

person Lova    schedule 09.09.2014

Удивительно, как мало людей предложили это. Вот правильный способ (без взлома)

Во-первых, сделайте так, чтобы ваш navigationBar имел начало координат Y, равное 20.

Затем в файле .h установите ViewController как UIBarPositioningDelegate:

@interface XYZViewController : UIViewController <UIBarPositioningDelegate>

И в файле .m:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationBar.delegate = self;
}

- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar { 
    return UIBarPositionTopAttached; 
}
person Jeffrey Sun    schedule 26.07.2014