UINavigationBar без UINavigationController

Я хочу иметь UINavigationBar в верхней части моего приложения, например, как в приложении для телефона, но я не хочу использовать его с UINavigationController, то есть я хочу использовать его как "автономный" объект.

Контроллер представления, который будет иметь UINavigationBar, имеет свой вид в файле .xib. Я попытался перетащить экземпляр UINavigationBar из библиотеки объектов, и он отлично работает, но строка состояния приложения по-прежнему белая, а UINavigationBar - серая. Я хочу, чтобы строка состояния имела тот же серый оттенок, но не остальную часть вида.

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

iPhone Phone App

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

My iPhone app

Я также попытался использовать следующий код в контроллере представления.

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.navigationItem.title = @"Köp ProViva";
}

Я попробовал это как с UINavigationBar, так и без него, но ни одна панель навигации не появляется или выглядит так же, как раньше.

Как добавить UINavigationBar и иметь строку состояния одного цвета?

Ответ 1

Вы можете реализовать метод делегата -positionForBar: протокола UINavigationBarDelegate и просто вернуть UIBarPositionTopAttached.

Пример:

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

//if you're not using a `UINavigationController` and instead
//simply want a `UINavigationBar` then use the following method as well
-(void)testMethod
{
    UINavigationBar *navBar = [[UINavigationBar alloc] init];
    [navBar setFrame:CGRectMake(0, 20, self.view.frame.size.width, 44)];
    [navBar setBarTintColor:[UIColor lightGrayColor]];
    [navBar setDelegate:self];
    [self.view addSubview:navBar];
}

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

Ответ 2

//Создание простой панели навигации

UINavigationBar *headerView = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
headerView.topItem.title = @"title";
[self.view addSubview:headerView];

Ответ 3

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

Что касается UINavigationBar, он просто модифицирует объект UINavigationBar, который поможет.

Пример:

- (void)viewDidLoad
{
    [super viewDidLoad];

    //...

    //ISSUE 1: StatusBar Background
    UIView *vwStatusBarUnderlay = [[UIView alloc] init];
    [vwStatusBarUnderlay setFrame:CGRectMake(0, 0, self.view.frame.size.width, 20)];
    [vwStatusBarUnderlay setBackgroundColor:[UIColor lightGrayColor]];
    [self.view addSubview:vwStatusBarUnderlay];
    //[vwStatusBarUnderlay sendSubviewToBack:self.view];

    //ISSUE 2: NavigationBar
    UINavigationBar *navBar = [[UINavigationBar alloc] init];
    [navBar setFrame:CGRectMake(0, 20, self.view.frame.size.width, 44)];
    [navBar setBarTintColor:[UIColor lightGrayColor]];
    [navBar setTranslucent:NO];

    UINavigationItem *navItem = [[UINavigationItem alloc] init];
    [navItem setTitle:@"Favoriter"];
    [navItem setRightBarButtonItem:[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:nil action:nil]];

    [navBar setItems:@[navItem]];
    [self.view addSubview:navBar];
}

Ответ 4

Первый ответ сработал у меня, но вот он в Swift вместо Objective-C:

1- вы устанавливаете делегат навигационной панели в viewcontroller, будь то через раскадровку или код.
2- добавьте UINavigationBarDelegate в свои протоколы контроллера или расширьте его следующим образом:

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

Что он, отлично работает!

Ответ 5

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

В файле AppDelegate.m;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
      //Set status bar style here
       [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

}