web-dev-qa-db-fra.com

Comment ajouter une image au centre de la barre de navigation dans Objective-C?

Je développe dans IOS, j'utilise le code suivant pour définir un arrière-plan sur navigationBar.

[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"bar-back"] forBarMetrics:UIBarMetricsDefault];

Et je veux ajouter une image sur navigationBar et au centre de navigationBar comme sur l’image suivante.

enter image description here

Comment ajouter une image au centre de navigationBar dans Objective-C?

Merci d'avance.

13
Wun

Définir l'affichage du titre de navigation comme ci-dessous 

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



MODIFIER:
si vous avez une grande image, utilisez le code ci-dessous

UIImage *img = [UIImage imageNamed:@"1.png"];
UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
[imgView setImage:img];
// setContent mode aspect fit
[imgView setContentMode:UIViewContentModeScaleAspectFit];
self.navigationItem.titleView = imgView;
31
Jageen

Comme vous l'avez dit pour définir une icône pour l'application. Vous aimerez peut-être cela, qui affichera une icône pour l’ensemble de l’application.

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon"]];
CGSize imageSize = CGSizeMake(40, 40);
CGFloat marginX = (self.navigationController.navigationBar.frame.size.width / 2) - (imageSize.width / 2);

imageView.frame = CGRectMake(marginX, 0, imageSize.width, imageSize.height);
[self.navigationController.navigationBar addSubview:imageView];

Sortie:

enter image description here

6
Kampai

Une chose à mentionner ici est d’utiliser une largeur de 3 pour UIImageView. C'est important - si c'est 2 (ou n'importe quel nombre pair), alors l'image sera floue. La définition de clipToBounds = NO et contentMode = UIViewContentModeScaleAspectFill signifie que l'image s'affiche en dehors de la largeur de la vue (fin) et est correctement proportionnée.

UIImageView *imageView = [[UIImageView alloc]
        initWithFrame:CGRectMake(0,0,3,44)];
    imageView.contentMode = UIViewContentModeScaleAspectFill;
    imageView.clipsToBounds = NO;
    imageView.image = [UIImage imageNamed:@"navigation-logo"];
    controller.navigationItem.titleView = imageView;
2
Ronaldoh1
 viewController.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"yourimage.png"]];
1
Fawad Masud

Je faisais face au même problème, puisque iOS 11 et Xcode 9 ont commencé à gérer les barres de navigation avec la mise en page automatique au lieu de cadres, vous devez connaître la mise en page de votre barre de navigation.

Dans la session 204 de la WWDC, la mise à jour de votre application pour iOS 11 indiquait que UIToolBar et UINavigationBar avaient été mis à niveau pour utiliser la présentation automatique. Pour éviter les affichages personnalisés de taille zéro, vous devez en savoir plus sur certaines choses.

UINavigation et UIToolBar fournissent une position, ne vous en souciez pas.

Vous devez fournir la taille de la vue personnalisée avec l’un des éléments suivants:

  • Contraintes de largeur et de hauteur.
  • Implémenter intrinsicContentSize
  • Connectez vos sous-vues via des contraintes.

En réponse à votre question, j'ai défini le titleView avec un ImageView, en fournissant la taille de deux manières différentes:

Donner explicitement la hauteur et la largeur.

-(void)updateNavTitleView{
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[ UIImage imageNamed:@"TitleViewImage"]];
    [imageView.widthAnchor constraintEqualToConstant:160].active = YES;
    [imageView.heightAnchor constraintEqualToConstant:44].active = YES;
    self.navigationItem.titleView = imageView;
}

Ou définir le mode d'aspect comme aspectFit

-(void) updateNavTitleView{
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[ UIImage imageNamed:@"TitleViewImage"]];
    [imageView setContentMode:UIViewContentModeScaleAspectFit];
    self.navigationItem.titleView = imageView;
}

Si vous voulez regarder la session, Session 204

1
Andrés Sánchez

Si quelqu'un avait besoin de faire ce qui précède dans Swift (4.2):

notez la fonction ci-dessous:

func addMiddleImage(){
    //Initialize your UIImage
    let yourImage = UIImage(named: "imageName")!.withRenderingMode(.alwaysOriginal)

    //Initialize a UIImageView
    let imageView = UIImageView(image: yourImage)

    //Set your Navigation Bar to the inialized UIImageView
    self.navigationItem.titleView = imageView

}

ajoutez-le à votre rappel ViewDidLoad ():

 override func viewDidLoad() {
    super.viewDidLoad()
    self.addMiddleImage()
}

Bonne chance

0
MhmdRizk

essaye ça :

 UIImage *logo = [UIImage imageNamed:@"logo.png"];
 UIImageView *imageView = [[UIImageView alloc] initWithImage: logo];
 imageView.frame = CGRectMake(160, 2, 40, 40);
self.navigationItem.titleView = [[UIImageView alloc] initWithImage:logo];
0
Nitin
UIImageView *navbarImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"logo.png"]];
navbarImageView.contentMode = UIViewContentModeScaleAspectFit;
self.navigationBar.titleView = navbarImageView;
0
AlexM