Подтвердить что ты не робот

Панель состояния iOS 7 соприкасается с NavigationBar

У меня есть контроллер представления в моем приложении, в котором панель навигации перетаскивается в раскадровку. Он отлично работал в iOS 6, но в iOS 7 он выглядел следующим образом:

ios 7 status bar nav var

Строка состояния и панель навигации не должны сталкиваться друг с другом. Я видел много таких вопросов о переполнении стека, но они не очень помогли мне.

Некоторые вопросы говорят, что я должен использовать этот "self.edgesForExtendedLayout = UIRectEdgeNone"; но это не сработало. Некоторые говорят, что я должен удалить панель навигации и встроить ее в контроллер навигации, который я не могу сделать из-за того, как моя программа реализована. Некоторые решения предлагают использовать границы обзора, и все, кроме меня, не работало и для меня.

Что может помочь мне решить эту проблему. Спасибо заранее!

ОБНОВЛЕНИЕ: Я встроил контроллер представления в контроллер uinavigation. Удалена панель навигации, добавленная ранее вручную. Теперь он выглядит нормально в раскадровке, но когда я запускаю его, он показывает следующее:

iOS 7 Navigation Status bar

Он показывает текст с другого контроллера представления, который в настоящее время находится за ним, который является его родительским контроллером представления. Теперь его прозрачность. Может ли кто-нибудь указать, что я делаю неправильно?

4b9b3361

Ответ 1

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

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

Прежде всего, если вы новичок и только что начали разработку iOS и запутались, как работает строка состояния и панель навигации, вы можете просто просмотреть сообщение в блоге ЗДЕСЬ, что я нашел очень полезным. Он содержит всю информацию, касающуюся навигации и строки состояния в iOS 7.

Теперь подошел к ответу на ваш вопрос. Прежде всего, я вижу две разные проблемы. Во-первых, ваша строка состояния и панель навигации как бы сталкиваются друг с другом, как показано вами в вопросе с изображением.

ПРОБЛЕМА:. Проблема в том, что ранее вы перетащили навигационную панель в свой контроллер просмотра, который работал в iOS 6 правильно, но с приходом iOS 7 SDK этот подход приводит к статусу бар и панель навигации, перекрывающиеся друг с другом.

РЕШЕНИЕ к первой проблеме: Вы можете использовать UIBarPositionTopAttached или использовать ограничения и рамки обзора, я также могу предложить и связать вас с Документация Apple и bla bla bla, но для решения проблемы потребуется некоторое время.

Самый лучший и самый простой способ решить эту проблему - просто встраивать свой контроллер представления в контроллер навигации, и это все. Вы можете сделать это, просто выбрав контроллер представления и перейдя в Редактоp > Вставить в > Контроллер навигации. (Если на вашей старой панели навигации есть какой-либо контент, вы можете сначала перетащить его вниз, встроить контроллер вида в контроллер навигации, а затем переместить кнопки панели на новой панели навигации, а затем удалить старую панель навигации)

РЕШЕНИЕ к второй проблеме: Это решение относится к вашему конкретному вопросу, который вы упомянули в обновлении, и не для широкой публики, читающего это. Поскольку вы можете видеть, что панель навигации и состояния не видна, а прозрачная область показывает родительский контроллер представления. Я не очень понимаю, почему вы столкнулись с этой проблемой, но, скорее всего, из-за какой-то сторонней библиотеки, такой как ECSlidingView или любой другой. Вы можете выбрать этот контроллер вида в своем раскадровке и установить цвет фона в представлении таким же, как и панель навигации. Это перестанет показывать контроллер родительского представления, и ваша панель навигации и строка состояния начнут отображаться. Теперь вы можете покрыть остальную часть своего контроллера просмотра текстовым представлением или тем, что вы используете в нем.

Надеюсь, это поможет!

Ответ 2

Панель навигации слишком близко к строке состояния, потому что, начиная с iOS 7, строка состояния больше накладывается на весь вид контроллера. Поскольку ваша панель навигации находится на (0, 0), строка состояния будет отображаться поверх панели навигации. Чтобы решить эту проблему, просто переместите панель навигации вниз (или, как говорили другие), создайте ограничение между навигационной панелью и topLayoutGuide.

Когда вы это сделаете, вы увидите, что между навигационной панелью и верхней частью экрана есть 20-точечный разрыв. Это потому, что вы просто переместили навигационную панель на 20 пунктов. "Но UINavigationController может сделать это правильно!" Абсолютно, и он делает это, реализуя UIBarPositioningDelegate на вашем контроллере вида. Это протокол одного метода, который должен быть реализован следующим образом:

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

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

Еще одна вещь, которую вы видите, - это то, что панель навигации полупрозрачна, что означает, что что-то под навигационной панелью будет видно в некоторой степени. Свойство translucent на UINavigationBar по умолчанию установлено на YES на iOS 7. Перед iOS 7 по умолчанию было NO.

Ответ 3

вы можете просто сделать это:

1) добавьте ограничение между панелью навигации и руководством по верхнему макету (выберите navigationBar, удерживайте клавишу ctrl и перейдите к руководству Bottom Layout Guide, удерживайте клавишу ctrl)

Add vertical Contrain

2) выберите вертикальный интервал:

vertical spacing

3) установите константу на 0:

vertical spacing constant

Результат:

result

UPDATE

В файле AppDelegate вы можете добавить это:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
{
  // Prevent Navigationbar to cover the view
  UINavigationBar.appearance().translucent = false
}

Ответ 5

Это работает для меня, надеюсь, у вас тоже будет такая же удача:).
Добавьте ниже код в свой вид.

-(void) viewDidLayoutSubviews
{
    CGRect tmpFram = self.navigationController.navigationBar.frame;
    tmpFram.origin.y += 20;
    self.navigationController.navigationBar.frame = tmpFram;
}

В основном это изменяет расположение навигационной панели.

Ответ 6

Сначала установите значение UIViewControllerBasedStatusBarAppearance в НЕТ в Info.plist. Затем в методе AppDelegate application:didFinishLaunchingWithOptions: добавьте:

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);
   self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);
 }
 return YES;

Ответ 7

Это новая функция с IOS7. Вместо того, чтобы смотреть на навигационную панель 20 пикселей в IOS7, глядя на 0 px. В качестве решения сдвиньте весь вид вниз на 20 пикселей или вы можете использовать изображение для панели навигации с высотой 64 пикселя.

Ответ 8

В случае, если это все еще помогает кому-то, это то, что сработало для меня, чтобы немного сдвинуть панель навигации в 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;
    }
}

На устройстве с ios 6.1 и ниже панель навигации не будет изменяться, как и раньше.

И это то, что я использовал для добавления содержимого строки состояния:

-(UIStatusBarStyle)preferredStatusBarStyle{
    return UIStatusBarStyleLightContent;
}

Ответ 9

Если ваш UIViewController НЕ находится в UINavigationController, и вы используете UIStoryBoard, вы можете установить для "iOS 6/7 Deltas" значение 20 для дельта Y, для каждого подсмотра, который должен быть смещен из UIStatusBar.

enter image description here

Ответ 11

в предыдущем окне iOS после строки состояния и в окне iOS 7 начинается с 0px в более ранней версии. Высота представления - 460 (iPhone 4 и более ранние) и 548 (iPhone 5), но в iOS 7 высота просмотра - 480 (iPhone 4 и более ранних версий ) и 568 (iPhone 5 и более поздние), поэтому вам нужно начать компоновку просмотра после 2o px или вам нужно начать просмотр с 20px.

вы можете написать ниже код в корневом контроллере или во всех viewcontroller для установки вида из 20px

#define IOS7_HEIGHT             64

- (void)viewDidLayoutSubviews {
    NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
    if ([currSysVer compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending)
    {
        CGRect frame=[self.view frame];
        if (frame.origin.y!=IOS7_HEIGHT) {

            frame.origin.y = IOS7_HEIGHT;
            frame.size.height -= IOS7_HEIGHT;
            [self.view setFrame:frame];
            [self.view layoutSubviews];
        }
    }
}

здесь высота равна 64, потому что 20 для строки состояния и 44 для панели навигации. попробуйте под кодом, это поможет вам. и ваша проблема будет решена.

Ответ 12

Для тех, у кого возникают проблемы с внедрением решения @Masterfego (которое также является официальным, но у меня были проблемы с Xcode 6.3 и автоматическими ограничениями), это то, что я сделал:

У меня есть UIViewController с добавленной панелью навигации. Я выбрал панель NAvigation и добавил ограничение на высоту 64px. Позже мы увидим предупреждение о том, что navbar будет выше (но это то, что мы делаем). Наконец, вы можете видеть, что строка состояния выглядит красиво и имеет тот же цвет, что и навигация.:)

PS: Я еще не могу отправлять изображения.

Ответ 13

Использование Swift:

Как сказал @Scott Berrevoets в своем ответе, вам нужно реализовать метод positionForBar в протоколе UIBarPositioningDelegate, но поскольку протокол UINavigationBarDelegate реализует этот протокол:

public protocol UINavigationBarDelegate : UIBarPositioningDelegate {
   ...
}

Вам нужно только установить delegate из UINavigationBar, который вы установили с помощью Storyboard, и реализовать этот метод и сделать это, например, следующим образом:

class ViewController: UIViewController, UINavigationBarDelegate {

   @IBOutlet weak var navigationBar: UINavigationBar!

   override func viewDidLoad() {
       super.viewDidLoad()
       self.navigationBar.delegate = self 
   }

   override func didReceiveMemoryWarning() {
       super.didReceiveMemoryWarning()
       // Dispose of any resources that can be recreated.
   }

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

Примечание: Стоит упомянуть, если вы установите положение оси y на панели навигации, скажем, до 40 от вершины, затем она будет расширяться снизу вверх от этой позиции, чтобы имитировать поведение UINavigationController, которое вам нужно для установки на 20 сверху.

Надеюсь, это поможет вам.

Ответ 14

Возможно, вы можете создать ограничения, которые прилагаются к руководству верхнего плана, чтобы указать положение навигационной панели относительно строки состояния. Дополнительную информацию об использовании руководств макета см. В Руководстве по переходу на iOS 7 UI: раздел "Внешний вид и поведение" .

Ответ 15

это лучший ответ. Но я хотел знать, как использовать Storyboard и тащить UINavigationBar на нем. Когда я реализовал метод делегата и задал возвращаемый результат UIBarPositionTopAttached, он не работал.

- (void)viewDidLoad{
    self.navigationbar.delegate = self;
}
- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar{
    NSLog(@"Got it");
    //
    //    CGRect frame = self.navigaitonBar.frame;
    //
    //    frame = CGRectMake(0, 20, CGRectGetWidth(frame), CGRectGetHeight(frame));
    //    self.navigaitonBar.frame = frame;
    //
    //    NSLog(@"frame %f",frame.origin.y);
    return UIBarPositionTopAttached;
}

Ответ 16

Если вы используете Xcode 6 и Swift, вы можете сделать это:

  • Откройте файл info.plist вашего приложения.
  • Добавить логический ключ ViewControllerBasedStatusBarAppearance, если он не существует, и присвоить значение "НЕТ".
  • Добавьте "Стиль стиля строки", если он не существует, и выберите для него значение "Непрозрачный черный стиль".