web-dev-qa-db-fra.com

Puis-je définir l'image comme titre de UINavigationBar?

Est-il possible de définir une image comme titre de la barre de navigation?

Je pense que l'application NYTimes utilisait une barre de navigation et que le titre ressemblait à un fichier image (la raison pour laquelle elle semble UINavigationBar est parce qu'ils utilisent le bouton droit pour rechercher).

65
Amit Vaghela

Vous pouvez utiliser une variable UIImageView pour la propriété UINavigationItem.titleView, par exemple:

self.navigationItem.titleView = myImageView;

Je trouve qu'un .png transparent à environ 35px de hauteur a bien fonctionné. 

- (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

Vous pouvez le faire directement depuis le storyboard (à partir de Xcode 7):

  1. Créez une vue en dehors de la vue principale du contrôleur de vue. Ce peut être une vue imbriquée ou juste une image
  2. Ajouter un élément de navigation à votre contrôleur de vue
  3. Ctrl + glisser de l'élément de navigation et déposer sur la vue extérieure 

 enter image description here

4.sélectionnez la vue titre

 enter image description here

11
Cinoss

J'ai créé une catégorie personnalisée pour UINavigationBar comme suit

UINavigationBar + CustomImage.h

#import <UIKit/UIKit.h>

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

UINavigationBar + 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    

Je l'invoque depuis mon UINavigationController

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

Cette ligne fonctionnera pour vous, je l’utilise toujours

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

Cela fonctionne aussi bien aussi

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

J'ai modifié le UINavigationBar + CustomImage.m pour que le titre reste visible pour l'utilisateur. Il suffit d'utiliser insertSubview: atIndex: au lieu de addSubview:

UINavigationBar + 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.

Faites-le rapidement en utilisant le storyboard et @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
        }
    }
}

Puis, dans l'inspecteur d'attributs, sélectionnez une image:

 enter image description here

et attendez une seconde pour le résultat:

 enter image description here

Donc, la vue est là où elle devrait être ... dans le storyboard.

3

Pour ceux qui ont la même erreur mais dans Xamarin Forms, la solution consiste à créer une application Renderer dans iOS et à définir l'image comme suit: 

[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;
            }
        }
    }
}

J'espère que ça aide quelqu'un!

2
Dr TJ

Dans MonoTouch, vous pouvez utiliser ceci:

 this.NavigationItem.TitleView = myImageView;
0
BahaiResearch.com

Si vos boutons disparaissent lorsque vous naviguez dans les deux sens, cette erreur a été corrigée:

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

J'ai modifié le code UINavigationBar + CustomImage pour fonctionner correctement sans fuite de mémoire.

- (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

Voici comment procéder dans MonoTouch (Xamarin) avec C # .NET

Créez un UIViewConvrtoller qui se trouve dans un NavigationController, puis appelez-le à tout moment:

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

Remarque: MediaProvider est simplement une classe qui récupère des images.

Cet exemple permet à la vue de remplir toute la barre de navigation et laisse également apparaître le texte de la légende des éléments.

0
BahaiResearch.com

ios5.0 a introduit un tas de fonctionnalités pour personnaliser l'apparence des éléments standard. Si vous ne souhaitez pas utiliser ImageView pour le titre, vous pouvez également personnaliser l'apparence de toutes les barres UINav à l'aide d'une image d'arrière-plan et d'une police/couleur personnalisée.

- (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

Ajoutez une image à la barre de navigation avec Swift qui s'adapte à la taille voulue et se clipse aux limites. Vous pouvez appeler cette fonction dans la fonction viewDidLoad () des contrôleurs de vue.

func setupNavigationBarWithTitleImage(titleImage: UIImage) {

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

}
0
user3378170

Juste utiliser

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

où myImage est de type UIImageView et navController est de type UINavigationController.

0
J.Raza