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];
}