Добавить панель навигации в представление без контроллера навигации
У меня есть боковое меню, которое выдвигается для отображения табличного представления, и оттуда у меня есть сегменты, которые используют контроллер представления представления. Segue должен подключаться непосредственно к контроллеру вида; Я не могу использовать навигационный контроллер.
Как добавить панель навигации с элементом кнопки панели без контроллера навигации?
![the story board has the navigation item]()
![the app does not]()
Ответы
Ответ 1
Хотя есть несколько разумных способов ответить на ваш вопрос. Я просто решил это программно и написал следующий код в моем viewWillAppear
(примечание - viewDidLoad
тоже нормально, но не предлагалось) -
-(void) viewWillAppear:(BOOL)animated {
UINavigationBar *myNav = [[UINavigationBar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
[UINavigationBar appearance].barTintColor = [UIColor lightGrayColor];
[self.view addSubview:myNav];
UIBarButtonItem *cancelItem = [[UIBarButtonItem alloc] initWithTitle:@"Cancel"
style:UIBarButtonItemStyleBordered
target:self
action:nil];
UIBarButtonItem *doneItem = [[UIBarButtonItem alloc] initWithTitle:@"Done"
style:UIBarButtonItemStyleBordered
target:self action:nil];
UINavigationItem *navigItem = [[UINavigationItem alloc] initWithTitle:@"Navigation Title"];
navigItem.rightBarButtonItem = doneItem;
navigItem.leftBarButtonItem = cancelItem;
myNav.items = [NSArray arrayWithObjects: navigItem,nil];
[UIBarButtonItem appearance].tintColor = [UIColor blueColor];
}
Итак, у вас есть белая панель навигации с элементами панели с голубым стержнем без навигационного контроллера. Опять же, есть и другие способы его реализации в вашем случае. Надеюсь, это было полезно.
Выход -
![enter image description here]()
Обновить -
Чтобы добавить изображения -
UIImageView *myImage = [[UIImageView alloc] initWithFrame:CGRectMake(0,10,32,32)];
[myImage setImage:[UIImage imageNamed:@"image.png"]];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:myImage];
[self.view addSubview:myImage];
Ответ 2
Для этого используется способ NavigationItem
в построителе интерфейса.
Сначала добавьте NavigationItem
к вашему ViewController
в построителе интерфейса, например, с NavigationController
. Убедитесь, что символ NavigationBar
отображается, выбрав что-то отличное от Inferred
и None
под имитированными метриками.
Во-вторых, в viewDidLoad
просто добавьте следующие строки:
- (void)viewDidLoad
{
[super viewDidLoad];
UINavigationBar *bar = [[UINavigationBar alloc] initWithFrame: frame];
bar.items = @[self.navigationItem];
[self.view addSubview: bar];
}
Что касается frame
, width
будет таким же, как ваш ViewController
, а height
будет либо 44.0
, либо 64.0
в зависимости от того, будет ли отображаться status bar
или нет.
CGFloat navigationBarHeight = 44.f + [UIApplication sharedApplication].statusBarFrame.size.height;
CGRect frame = CGRectMake(0, 0, self.view.frame.size.width, navigationBarHeight);
И если вы хотите поддерживать разные ориентации, используйте NSLayoutConstraints
:
CGFloat navigationBarHeight = 44.f + [UIApplication sharedApplication].statusBarFrame.size.height;
[self.view addConstraints: @[
[NSLayoutConstraint constraintWithItem: self.view
attribute: NSLayoutAttributeLeft
relatedBy: NSLayoutRelationEqual
toItem: bar
attribute: NSLayoutAttributeLeft
multiplier: 1.0
constant: 0.0],
[NSLayoutConstraint constraintWithItem: self.view
attribute: NSLayoutAttributeRight
relatedBy: NSLayoutRelationEqual
toItem: bar
attribute: NSLayoutAttributeRight
multiplier: 1.0
constant: 0.0],
[NSLayoutConstraint constraintWithItem: self.view
attribute: NSLayoutAttributeTop
relatedBy: NSLayoutRelationEqual
toItem: bar
attribute: NSLayoutAttributeTop
multiplier: 1.0
constant: 0.0],
[NSLayoutConstraint constraintWithItem: bar
attribute: NSLayoutAttributeHeight
relatedBy: NSLayoutRelationEqual
toItem: nil
attribute: NSLayoutAttributeNotAnAttribute
multiplier: 1.0
constant: navigationBarHeight],
]];
Ответ 3
Версия Swift 4
let navigationBar = UINavigationBar(frame: CGRect(x: 0, y: 0, width: 320, height: 50))
navigationBar.barTintColor = UIColor.lightGray
view.addSubview(navigationBar)
let cancelButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: nil)
let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: nil)
let navigationItem = UINavigationItem(title: "Title")
navigationItem.leftBarButtonItem = cancelButton
navigationItem.rightBarButtonItem = doneButton
navigationBar.items = [navigationItem]
Ответ 4
будьте очень осторожны при добавлении в viewWillAppear, так как этот метод может вызываться несколько раз (например, появляется модальное имя....), поэтому используйте ленивый подход:
1) объявить переменную:
var myNav: UINavigationBar?
2) проверить, если уже установлено:
viewWillAppear:(BOOL)animated {
if self.myNav != nil{
return
}
self.myNav = ....
3) обязательно удалите выходной контроллер, например на didDisappear...
Ответ 5
будьте очень осторожны при добавлении в viewWillAppear, так как этот метод может вызываться несколько раз (например, появляется модальное имя....), поэтому используйте ленивый подход:
1) объявить переменную:
var myNav: UINavigationBar?
2) проверить, если уже установлено:
viewWillAppear:(BOOL)animated {
if self.myNav != nil{
return
}
self.myNav = ....
3) обязательно удалите выходной контроллер, например на didDisappear...
обратите внимание.. не правильно указывать размер.. если iOS вращается, он не работает нормально..