Положение навигационной панели для модального просмотра - iOS7

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

как это

enter image description here

Но в режиме просмотра, когда вы перетаскиваете панель навигации, вы можете позиционировать ее справа вверху, что слишком близко к информации о несущей/батарее.

enter image description here

Итак, вы можете перетащить его, угадать, насколько далеко он соответствует позиции автоматически созданного, но тогда у вас есть цветовое несоответствие. Я попробовал изменить настройки строки состояния в IB, не имеет значения.

enter image description here

Есть ли правильный способ справиться с этим, так как при создании модального представления выглядят как автоматически созданный навигационный вид.

Спасибо

Ответ 1

Лучший способ преодолеть это в iOS 7 - это соответствовать новому протоколу UIBarPositioningDelegate.

Вы подключаете делегат вашего навигационного блока к контроллеру представления (установите контроллер представления в качестве делегата для панели навигации либо через раскадровку, либо через код) и совместите с этим протоколом и реализуете метод

-(UIBarPosition)positionForBar:(id<UIBarPositioning>)bar { return UIBarPositionTopAttached; }

Вы можете удалить верхний зазор в контроллере представления. Вам нужно поместить планку на 20 точек ниже верхнего края.

Ответ 2

Выявили 3 варианта решения этой проблемы.

Вариант 1: изменение размера панели навигации

float currentVersion = 7.0;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= currentVersion) {
    // iOS 7
    self.navBar.frame = CGRectMake(self.navBar.frame.origin.x, self.navBar.frame.origin.y, self.navBar.frame.size.width, 64);
}

Вариант 2: Скрыть строку состояния

Например, в модальном представлении, в котором вы хотите скрыть строку состояния

Добавьте этот метод

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

В viewDidLoad добавить

float currentVersion = 7.0;

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= currentVersion) {
    [self prefersStatusBarHidden];
    [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
}
else {
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
}

Теперь, когда вы отклоняете модальное представление, и вы хотите, чтобы ваша строка статуса была обратно. Добавьте это в viewWillAppear

    float currentVersion = 7.0;

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= currentVersion) {
    [self prefersStatusBarHidden];
    [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
    NSLog(@"ios7");
}
else {
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide];
}

и это, но верните НЕТ на этот раз

- (BOOL)prefersStatusBarHidden
{
    return NO;
}

Вариант 3: Вставить в контроллер Nav

Выберите свой модальный вид, просто вставьте его в контроллер навигации.

enter image description here

Ответ 3

В Swift:

Лучший способ преодолеть это в iOS 8.1 и Swift - это соответствовать новому протоколу UIBarPositioningDelegate.

Вы подключаете делегат вашего навигационного блока к контроллеру представления и соответствуете этому протоколу и вызываете метод:

func positionForBar(bar: UIBarPositioning) -> UIBarPosition  {
    return UIBarPosition.TopAttached
}

Вы можете удалить верхний зазор в контроллере представления. Вам нужно поместить планку на 20 пунктов ниже верхнего края.

Ответ 4

Для Swift3 используйте следующую команду.

func position(for bar: UIBarPositioning) -> UIBarPosition{
    return .topAttached;
}

Ответ 5

После нескольких попыток переместить панель навигации несколько пикселей в iOS 7, это то, что, наконец, помогло мне:

-(void)viewWillLayoutSubviews
{
    float iosVersion = 7.0;
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= iosVersion) {
        // iOS 7+
        CGRect viewFrame = self.view.frame;
        viewFrame.origin.y += 10;
        self.view.frame = viewFrame;
    }
}

Я также настроил цвет строки состояния, чтобы лучше совместить мой контент:

-(UIStatusBarStyle)preferredStatusBarStyle{
    return UIStatusBarStyleLightContent;
}

Ответ 6

Я создал контроллер навигации, удалил "Root View Controller", который появился с ним. Затем удерживайте ctrl и перетащите "Контроллер навигации" в свой вид (удалите навигационную панель, добавленную вручную вручную). Установите контроллер навигации как "Начальный контроллер просмотра", и теперь он отлично работает для меня.

Ответ 7

Я отключил "Использовать автоспуск", и это сработало для меня.