2013-03-04 18 views
18

私はUIViewControllerのviewDidLoadでこのコードスニペットを使用しました。私は間違いなし。画像が存在します。私はバックグラウンドを取得しますが、イメージは取得しません。画像はロゴの一種です。UIViewControllerのnavigationBarの中心にイメージを置く方法は?

if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) { 

    /* Background of navigationBar. */ 
    UIImage * navigationBarImage = [UIImage imageNamed:@"01_navbar_portrait.png"]; 
    [self.navigationController.navigationBar setBackgroundImage:navigationBarImage forBarMetrics:UIBarMetricsDefault]; 

    /* Image in navigationBar */ 
    UIImage * logoInNavigationBar = [UIImage imageNamed:@"01_logo.png"]; 
    UIImageView * logoView = [[UIImageView alloc] init]; 
    [logoView setImage:logoInNavigationBar]; 
    self.navigationController.navigationItem.titleView = logoView; 

} 
+0

もしあなたがnav barの画像(ロゴ)センターを入れたら、タイトルについては? – Hari1251

+0

ナビゲーションコントローラ自体のナビゲーション項目ではなく、ナビゲーションスタックにプッシュされるビューコントローラのナビゲーション項目を設定する必要があります。私の答えを見てください。 – jhabbott

答えて

47

UINavigationControllerは、ナビゲーションバーの管理を使用し

logoView.frame = CGRectMake(initialize frame here); 

によって、それは、フレームの指定しますナビゲーションスタックに表示されます。ビューをロゴに変更するには、ロゴを使用するビューコントローラー(ルートビューコントローラーまたはスタック上にプッシュされる別のコントローラー)でこれを設定する必要があります。

は、あなたのビューコントローラのviewDidLoadにこのような何かを:あなたのケースで

UIImage* logoImage = [UIImage imageNamed:@"logo.png"]; 
self.navigationItem.titleView = [[UIImageView alloc] initWithImage:logoImage]; 

を、あなたは間違ったナビゲーション項目設定されています

// Oops... 
self.navigationController.navigationItem.titleView = logoView; 
// Should be this: 
self.navigationItem.titleView = logoView; 
+4

タイトルはUIImageのサイズは?私は180 * 40で試しましたが、ぼやけています。 – Krunal

+0

OPと答えからの時間が長くなりましたが、これでハングアップしました:新しい 'UIViewController'が' self.navigationItem.titleView = logoView'の代わりに 'self.navigationController.navigationBar.topItem.titleView = logoView'の代わりに使われます。 'topItem'は' viewDidAppear'が起動するまで(まだ 'viewDidLoad'と' viewWillAppear'の古いビューコントローラを反映するまで)プッシュされた新しいビューコントローラを反映しないためにプッシュされます。 – spurgeon

+0

誰かがtitleViewのフレームを知っていますか? –

1

はあなただけ次に最上位のビューコントローラのnavigationItemプロパティを調べることで、次の

[self.navigationItem setTitleView:logoView]; 
+0

あなたの答えは正解です。他のすべての人がナビゲーションバーにイメージを置く方法を指定しています。問題は明らかにナビゲーションバーに画像をどのように配置するかを尋ねる。ありがとうございました。 – oyalhi

+0

これは、私は次のコードを持っていると言いました。しかし、それはまだ画像を中央に置かない。ナビゲーションバーの左右にあるものに応じて、ロゴは画面上ではなく空の中心に配置されます。すべてのポインタ?'let image = UIImageView(フレーム:CGRect(x:0、y:0、width: '))' let image = UIImage(名前: "some_logo")! ' ' let screenWidth = UIScreen.mainScreen()。bounds.width' ' screenWidth、height:42)) ' ' imageView.image = image' 'imageView.contentMode = .ScaleAspectFit' – oyalhi

9

まず、私たちは持っているビューを作成する必要がありますナビゲーションバーと同様のサイズ 次に画像ビューを追加し、ナビゲーションバーの中の のようにフレームを設定して設定します。すべてのiosバージョンで動作し、 は自動的にfraになりますデバイス(網膜または正常)ごとに私のサイズ と魔法のように動作します。

UIView *headerView = [[UIView alloc] init]; 
headerView.frame = CGRectMake(0, 0, 320, 44); 

UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Header.png"]]; 
imgView.frame = CGRectMake(75, 0, 150, 44); 
imgView.contentMode = UIViewContentModeScaleAspectFit; 

[headerView addSubview:imgView]; 

navigationCtrl.navigationBar.topItem.titleView = headerView; 

[headerView release]; 
[imgView release]; 
5

スウィフト:あなたが意味するものかもしれない何

var logoImage:UIImage = UIImage(named: "logo_text")! 
self.navigationItem.titleView = UIImageView(image: logoImage) 
2

が、私はそう場合は、あなた」、ナビゲーションバーのための中心背景画像を提供する方法を探して、このページに走りましたそのためにここに...ここには一つの方法があります。

another answerから少し盗むことで、画像を前景と背景に分割し、背景を伸ばしてフォアグラウンドを中心とする新しい画像を作成し、それをナビゲーションバーの背景画像として設定することができます。イメージを構築するので、次のように動作します。ここでは

// build an image by stretching the bg, then merging it with the fg 
CGSize barSize = self.navController.navigationBar.frame.size; 
UIImage *fg = [UIImage imageNamed:@"some_fg"]; 
UIImage *bg = [[UIImage imageNamed:@"some_bg"] 
       resizableImageWithCapInsets:UIEdgeInsetsMake(0.f,1.f,0.f,1.f)]; 
UIGraphicsBeginImageContextWithOptions(barSize, NO, 0.0); 
[bg drawInRect:CGRectMake(0, 0, barSize.width, barSize.height)]; 
[fg drawInRect:CGRectMake((barSize.width-fg.size.width)/2.f, 
          0, 
          fg.size.width, 
          fg.size.height)]; 
// grab the merged images 
UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
2
extension UINavigationController { 
func addLogoImage(image: UIImage, navItem: UINavigationItem) { 
    let imageView = UIImageView(image: image) 
    imageView.contentMode = .scaleAspectFit 
    imageView.translatesAutoresizingMaskIntoConstraints = false 

    let view = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 44)) 
    view.addSubview(imageView) 

    navItem.titleView = view 
    imageView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true 
    imageView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
    imageView.heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true 
    imageView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true 

    view.heightAnchor.constraint(equalTo: navigationBar.heightAnchor).isActive = true 
    view.centerXAnchor.constraint(equalTo: navigationBar.centerXAnchor).isActive = true 
    view.centerYAnchor.constraint(equalTo: navigationBar.centerYAnchor).isActive = true 
} 
} 

は、私が使用しているものです。

もちろん、右と左のバーボタンアイテムと衝突しないように、もっと多くの制約が必要な場合があります。

+0

奇妙な答えを試した後、あなたはついに仕上がりました。ありがとうございました! –