web-dev-qa-db-ja.com

UINavigationBarのタイトルとして画像を設定できますか?

ナビゲーションバーのタイトルとして画像を設定することはできますか?

NYTimesアプリケーションはナビゲーションバーを使用し、タイトルは画像ファイルのように見えると思います(UINavigationBarと思われる理由は、右ボタンを使用して検索するためです)。

66
Amit Vaghela

UINavigationItem.titleViewプロパティには、次のようなUIImageViewを使用できます。

self.navigationItem.titleView = myImageView;

高さ約35ピクセルの透明な.pngがうまく機能していることがわかりました。

- (void)awakeFromNib {

//put logo image in the navigationBar

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

}
16
Clifton Burt

ストーリーボードから直接実行できます(Xcode 7以降):

  1. View Controllerのメインビューの外側にビューを作成します。ネストされたビューまたは単なる画像にすることができます
  2. View ControllerにNavigation Itemを追加します
  3. Ctrl +ナビゲーション項目からドラッグして、外側のビューにドロップします

enter image description here

4.タイトルビューを選択

enter image description here

12
Cinoss

次のようにUINavigationBarのカスタムカテゴリを作成しました

INavigationBar + CustomImage.h

#import <UIKit/UIKit.h>

@interface UINavigationBar (CustomImage)
    - (void) setBackgroundImage:(UIImage*)image;
    - (void) clearBackgroundImage;
    - (void) removeIfImage:(id)sender;
@end

INavigationBar + CustomImage.m

#import "UINavigationBar+CustomImage.h"

@implementation UINavigationBar (CustomImage)

- (void) setBackgroundImage:(UIImage*)image {
    if (image == NULL) return;
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    imageView.frame = CGRectMake(110,5,100,30);
    [self addSubview:imageView];
    [imageView release];
}

- (void) clearBackgroundImage {
    NSArray *subviews = [self subviews];
    for (int i=0; i<[subviews count]; i++) {
        if ([[subviews objectAtIndex:i]  isMemberOfClass:[UIImageView class]]) {
        [[subviews objectAtIndex:i] removeFromSuperview];
    }
   }    
}

@end    

UINavigationControllerから呼び出します

[[navController navigationBar] performSelectorInBackground:@selector(setBackgroundImage:) withObject:image];
8
adam

この行はあなたのために動作します、私はいつもこれを使用します

[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"imageNavBar.png"]  forBarMetrics:UIBarMetricsDefault];
7
user1711665

これもうまくいく

[self.navigationController.navigationBar.topItem setTitleView:[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"YourLogo"]]];
5
MrChrisBarker

UINavigationBar + CustomImage.mを変更して、ユーザーにタイトルが表示されるようにしました。 addSubview:の代わりにinsertSubview:atIndex:を使用するだけです。

INavigationBar + CustomImage.m

#import "UINavigationBar+CustomImage.h"

@implementation UINavigationBar (CustomImage)

- (void) setBackgroundImage:(UIImage*)image {
    if (image == NULL) return;
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    imageView.frame = CGRectMake(0, 0, 320, 44);
    [self insertSubview:imageView atIndex:0];
    [imageView release];
}

- (void) clearBackgroundImage {
    NSArray *subviews = [self subviews];
    for (int i=0; i<[subviews count]; i++) {
        if ([[subviews objectAtIndex:i]  isMemberOfClass:[UIImageView class]]) {
        [[subviews objectAtIndex:i] removeFromSuperview];
    }
   }    
}

@end
5
ck.

ストーリーボードと@IBDesignable

@IBDesignable class AttributedNavigationBar: UINavigationBar {

    @IBInspectable var imageTitle: UIImage? = nil {

        didSet {

            guard let imageTitle = imageTitle else {

                topItem?.titleView = nil

                return
            }

            let imageView = UIImageView(image: imageTitle)
            imageView.frame = CGRect(x: 0, y: 0, width: 40, height: 30)
            imageView.contentMode = .scaleAspectFit

            topItem?.titleView = imageView
        }
    }
}

次に、属性インスペクターで画像を選択するだけです:

enter image description here

結果が出るまで少し待ちます:

enter image description here

したがって、ビューの設定は、ストーリーボード内の本来あるべき場所にあります。

同じエラーを持っているがXamarin Forms、解決策はRendererアプリでiOSを作成し、そのように画像を設定することです:

[Assembly: Xamarin.Forms.ExportRenderer(typeof(Xamarin.Forms.Page), typeof(MyApp.Renderers.NavigationPageRenderer))]
namespace MyApp.Renderers
{
    #region using

    using UIKit;
    using Xamarin.Forms.Platform.iOS;

    #endregion

    public class NavigationPageRenderer : PageRenderer
    {
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();
            SetTitleImage();
        }

        private void SetTitleImage()
        {
            UIImage logoImage = UIImage.FromFile(ResourceFiles.ImageResources.LogoImageName);
            UIImageView logoImageView = new UIImageView(logoImage);

            if (this.NavigationController != null)
            {
                this.NavigationController.NavigationBar.TopItem.TitleView = logoImageView;
            }
        }
    }
}

それが誰かを助けることを願っています!

2
Dr TJ

MonoTouchでは、これを使用できます。

 this.NavigationItem.TitleView = myImageView;
0

ナビゲーションを行ったり来たりするときにボタンが消えた場合は、これで修正されました。

NSArray *mySubviews = navigationBar.subviews;
UIImageView *iv = nil;

// Move in reverse direction as not to upset the order of elements in the array
for (int i = [mySubviews count] - 1; i >= 0; i--)
{
    if ([[mySubviews objectAtIndex:i] isMemberOfClass:[UIImageView class]])
    {
        NSLog(@"found background at index %d",i);
        iv = [mySubviews objectAtIndex:i];
        [[mySubviews objectAtIndex:i] removeFromSuperview];
        [navigationBar insertSubview:iv atIndex:0];
    }
}
0
snez

UINavigationBar + CustomImageコードを変更して、メモリリークなしで適切に動作するようにしました。

- (void)setBackgroundImage:(UIImage *)image
{
    if (! image) return;
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    imageView.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
    [self addSubview:imageView];
    [imageView release];
}

- (void) clearBackgroundImage
{
    // This runs on a separate thread, so give it it's own pool
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSArray *mySubviews = self.subviews;

    // Move in reverse direction as not to upset the order of elements in the array
    for (int i = [mySubviews count] - 1; i >= 0; i--)
    {
        if ([[mySubviews objectAtIndex:i] isMemberOfClass:[UIImageView class]])
        {
            [[mySubviews objectAtIndex:i] removeFromSuperview];
        }
    }

    [pool release];
}
0
Mr. Propa

以下は、C#.NETを使用した(Xamarinの)MonoTouchでこれを行う方法です。

NavigationControllerにあるUIViewConvrtollerを作成し、いつでもこれを呼び出します。

someNiceViewControllerYouMade.NavigationController.NavigationBar
     .InsertSubview(new UIImageView
     (MediaProvider.GetImage(ImageGeneral.navBar_667x44)),0);

注:MediaProviderは、画像を取得する単なるクラスです。

この例では、ビューがナビゲーションバー全体に表示され、アイテムのキャプションのテキストも表示されます。

0

ios5.0は、標準要素の外観をカスタマイズするための機能のヒープを導入しました。タイトルにImageViewを使用したくない場合は、代わりに、背景画像とカスタムフォント/色を使用して、すべてのUINavbarの外観をカスタマイズします。

- (void) customiseMyNav
{
    // Create resizable images
    UIImage *portraitImage = [[UIImage imageNamed:@"nav_bar_bg_portrait"] 
        resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
    UIImage *landscapeImage = [[UIImage imageNamed:@"nav_bar_bg_landscape"] 
        resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];

    // Set the background image
    [[UINavigationBar appearance]  setBackgroundImage:portraitImage forBarMetrics:UIBarMetricsDefault];
    [[UINavigationBar appearance]  setBackgroundImage:landscapeImage forBarMetrics:UIBarMetricsLandscapePhone];

    // set the title appearance
    [[UINavigationBar appearance] setTitleTextAttributes:
        [NSDictionary dictionaryWithObjectsAndKeys:
            [UIColor colorWithRed:50.0/255.0 green:150.0/255.0 blue:100/255.0 alpha:1.0], 
            UITextAttributeTextColor, 
            [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.6], 
            UITextAttributeTextShadowColor, 
            [NSValue valueWithUIOffset:UIOffsetMake(0, -1)], 
            UITextAttributeTextShadowOffset, 
            [UIFont fontWithName:@"Arial-Bold" size:0.0], 
            UITextAttributeFont, 
            nil]];
}
0
joneswah

Swiftで画像をnaviagtionBarに追加し、サイズに合わせて拡大縮小し、境界に合わせてクリップします。この関数は、View ControllerのviewDidLoad()関数内で呼び出すことができます。

func setupNavigationBarWithTitleImage(titleImage: UIImage) {

    let imageView = UIImageView(image: titleImage)
    imageView.contentMode = .ScaleAspectFit
    imageView.clipsToBounds = true
    navigationItem.titleView = imageView

}
0
user3378170

使うだけ

[navController.navigationBar insertSubview:myImage atIndex:0] ;

myImageはUIImageView型で、navControllerはUINavigationController型です

0
J.Raza