在没有导航控制器的情况下向视图添加导航栏

时间:2014-05-25 20:43:38

标签: ios cocoa-touch uinavigationcontroller storyboard uinavigationbar

我有一个侧面菜单,可以滑出来显示一个表视图,从那里我有使用显示视图控制器的segue。 segue必须直接连接到视图控制器;我无法使用导航控制器。

如何在没有导航控制器的情况下添加带有条形按钮项的导航栏?

the story board has the navigation item

the app does not

5 个答案:

答案 0 :(得分:19)

虽然有几种聪明的方法可以回答你的问题。我刚刚以编程方式解决了这个问题并在我的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];

答案 1 :(得分:5)

有一种方法可以在界面构建器中使用NavigationItem

首先在界面构建器中向NavigationItem添加ViewController,就像使用NavigationController一样。通过在模拟指标下选择NavigationBarInferred以外的内容,确保None可见。

其次,在viewDidLoad中,只需添加以下行:

- (void)viewDidLoad 
{
    [super viewDidLoad];

    UINavigationBar *bar = [[UINavigationBar alloc] initWithFrame: frame];
    bar.items = @[self.navigationItem];
    [self.view addSubview: bar];
}

对于framewidth将与您的ViewController相同,而height将是44.064.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],
                             ]];

答案 2 :(得分:2)

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]

答案 3 :(得分:1)

要非常小心地添加" viewWillAppear",因为这个方法可以被调用更多次(例如是一个模态出现....)所以使用一种懒惰的方法:

1)声明var:

var myNav: UINavigationBar?

2)测试是否已经设置:

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

3)确保删除退出的控制器,例如didDisappear ...

答案 4 :(得分:1)

要非常小心地添加" viewWillAppear",因为这个方法可以被调用更多次(例如是一个模态出现....)所以使用一种懒惰的方法:

1)声明var:

var myNav: UINavigationBar?

2)测试是否已经设置:

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

3)确保删除退出的控制器,例如didDisappear ...

注意..指定大小是不正确..如果iOS旋转,它不能正常工作..