web-dev-qa-db-ja.com

Navigation ControllerなしでビューにNavigation Barを追加する

テーブルビューを表示するためにスライドするサイドメニューがあり、そこからリビュービューコントローラーを使用するセグエがあります。セグエはView Controllerに直接接続する必要があります。 Navigation Controllerを使用できません。

Navigation Controllerなしでバーボタンアイテムを含むNavigation Barを追加するにはどうすればよいですか?

the story board has the navigation item

the app does not

20
user3381665

あなたの質問に答える賢い方法がいくつかありますが。プログラムで解決し、次のコードをviewWillAppearに記述しました(注-viewDidLoadも問題ありませんが、推奨されません)-

void)viewWillAppear:(BOOL)animated {
 
 UINavigationBar * myNav = [[UINavigationBar alloc] initWithFrame:CGRectMake(0、0、320、50)]; 
 [UINavigationBarの外観] .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]; 
 
 
 UINavigati onItem * navigItem = [[UINavigationItem alloc] initWithTitle:@ "Navigation Title"]; 
 navigItem.rightBarButtonItem = doneItem; 
 navigItem.leftBarButtonItem = cancelItem; 
 myNav.items = [ NSArray arrayWithObjects:navigItem、nil]; 
 
 [UIBarButtonItem外観] .tintColor = [UIColor blueColor]; 
} 

そのため、Navigation Controllerなしの青いバーボタンアイテムを備えた白いNavigation Barがあります。繰り返しますが、あなたのケースでそれを実装する他の方法があります。希望、これが役立った。

出力-

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];
20
raurora

これには、インターフェイスビルダーで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に関しては、widthViewControllerと同じになり、height44.0または64.0status 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],
                             ]];
6
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.leftBarButtonItem = cancelButton
    navigationItem.rightBarButtonItem = doneButton

    navigationBar.items = [navigationItem]
3
Vitaly

"viewWillAppear"の追加には非常に注意してください。このメソッドは何度も呼び出すことができるため(たとえば、モーダルが表示されます...)、レイジーアプローチを使用します。

1)変数を宣言します:

var myNav: UINavigationBar?

2)既に設定されている場合のテスト:

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

3)必ず既存のコントローラーを削除してください(didDisappearなど)。

note ..サイズを指定するのは正しくありません.. iOSが回転する場合、うまく動作しません。

1
ingconti

"viewWillAppear"の追加には非常に注意してください。このメソッドは何度も呼び出すことができるため(たとえば、モーダルが表示されます...)、レイジーアプローチを使用します。

1)変数を宣言します:

var myNav: UINavigationBar?

2)既に設定されている場合のテスト:

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

3)必ず既存のコントローラーを削除してください(didDisappearなど)。

1
ingconti