it-roy-ru.com

Добавить панель навигации в представление без контроллера навигации

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

Как добавить панель навигации с элементом кнопки панели без контроллера навигации?

the story board has the navigation item

the app does not

19
user3381665

Пока есть несколько умных способов ответить на ваш вопрос. Я просто решил это программно и написал следующий код в моей viewWillAppear (примечание - viewDidLoad тоже хорошо, но не рекомендуется) -

- (void) viewWillAppear: (BOOL) анимированный {

 UINavigationBar * myNav = [[UINavigationBar alloc] initWithFrame: CGRectMake (0, 0, 320, 50)]; 
 [UINavigationBar Внешний вид] .barTintColor = [UIColor lightGrayColor]; 
 [self.view addSubview: myNav]; 


 UIBarButtonItem * cancelItem = [[UIBarButtonItem alloc] initWithTitle: @ "Cancel" 
 Стиль: UIBarButtonItemStyleBordered 
 Цель: самостоятельно 
 Действие: ноль]; 

 UIBarButtonItem * doneItem = [[UIBarButtonItem alloc] initWithTitle: @ "Done" 
 Стиль: UIBarButtonItemStyleBordered 
 target: self action: nil]; 


 UINavigationItem * navigItem = [[UINavigationItem alloc] initWithTitle: @ "Название навигации"]; 
 navigItem.rightBarButtonItem = doneItem; 
 navigItem.leftBarButtonItem = cancelItem; 
 myNav.items = [NSArray arrayWithObjects: navigItem, nil]; 

 [UIBarButtonItem появление] .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];
19
raurora

Для этого есть способ использовать NavigationItem в конструкторе интерфейсов.

Сначала добавьте NavigationItem к вашему ViewController в конструкторе интерфейса, как это было бы с NavigationController. Убедитесь, что NavigationBar видим, выбрав что-то кроме Inferred и None в simulated metrics.

Во-вторых, в 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],
                             ]];
5
Aerows

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.rightBarButtonItem = cancelButton
    navigationItem.leftBarButtonItem = doneButton

    navigationBar.items = [navigationItem]
2
Vitaly

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

1) объявить переменную:

var myNav: UINavigationBar?

2) проверить, если уже установлено:

viewWillAppear:(BOOL)animated {
if self.myNav != nil{
     return
}
self.myNav = ....

3) обязательно удалите выходной контроллер, например на didDisappear ...

обратите внимание .. не правильно указывать размер .. если iOS вращается, он не работает нормально ..

1
ingconti

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

1) объявить переменную:

var myNav: UINavigationBar?

2) проверить, если уже установлено:

viewWillAppear:(BOOL)animated {
if self.myNav != nil{
     return
}
self.myNav = ....

3) обязательно удалите выходной контроллер, например на didDisappear ...

1
ingconti