2008-11-14 7 views

Répondre

122

Vous pouvez utiliser un UIImageView pour la propriété UINavigationItem.titleView, quelque chose comme:

self.navigationItem.titleView = myImageView; 
+11

Pas nécessairement pertinent à la question, mais si vous voulez alterner entre le titre par défaut et un titre d'image, vous pouvez revenir à celui par défaut en définissant 'self.navigationItem.titleView' à' nil' –

+2

Ce n'est plus fonctionne dans iOS6. L'image sera étirée et mal formée. –

+2

dans IOS6 vous pouvez maintenant définir une image de fond pour la barre de navigation. Toutefois, si vous utilisez ce code et voyez l'image étirée, vous ne définissez pas correctement contentMode sur le UIImageView que vous mettez dans titleView. –

8

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  

J'invoquez depuis mon UINavigationController

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

I modifié le UINavigationBar + CustomImage.m d'avoir le titre encore visible à 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 
+2

Bonjour. Le titre reste visible uniquement sur la vue immédiate, si l'utilisateur accède à une autre vue (à l'aide de navigationController pushViewController), seul l'arrière-plan apparaît. Comment puis-je résoudre ce problème? –

16

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

} 
+2

FYI: Je pense que cette ligne a besoin d'une version. – pmc255

+0

quelle est la taille de UIImage devrait être pour le titre ?? J'ai essayé avec 180 * 40 mais il devient flou. – Krunal

0

Il suffit d'utiliser

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

où myImage est de type UIImageView et NavController est de type UINavigationController

0

I 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

Voici comment vous le faire dans (de Xamarin) MonoTouch avec C# .NET

Créer un UIViewConvrtoller qui est dans un NavigationController puis appeler à tout moment:

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

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

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

0

Si vos boutons disparaissent lorsque vous naviguez dans les deux sens de la navigation, ce qu'il fixe pour moi:

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

ios5.0 introduit un tas de fonctionnalités pour personnaliser l'apparence des éléments standard.Si vous ne voulez pas utiliser ImageView pour le titre, une alternative serait de personnaliser l'apparence de tous les UINavbars en utilisant une image d'arrière-plan et 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

En MonoTouch vous pouvez utiliser ceci:

this.NavigationItem.TitleView = myImageView; 
7

Cette ligne va travailler pour vous, je l'utilise toujours

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

Cela fonctionne aussi bien trop

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

C'est le seul qui a fonctionné pour moi avec UINavigationViewController - Merci! – RPM

10

Vous pouvez le faire à partir du storyboard (à partir de Xc ode 7):

  1. Créer une vue en dehors de la vue principale du contrôleur de vue. Il 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 du poste de navigation et déposer sur la vue en dehors

enter image description here

Voir titre 4.select

enter image description here

2

Pour ceux qui ont la même erreur, mais dans Xamarin Forms, la solut ion est de créer un Renderer dans iOS application et définir l'image comme ceci:

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

it helps quelqu'un!

0

Ajouter une image à naviagtionBar avec SWIFT qui s'ajuste pour s'ajuster et se clipser 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 

} 
3

Faites-le rapidement à l'aide story-board 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 
     } 
    } 
} 

inspecteur ensuite dans les attributs il suffit de sélectionner une image:

enter image description here

et attendre une seconde pour résultat:

enter image description here

Donc la vue de mise en place est là où elle devrait être ... dans le storyboard.

Questions connexes