web-dev-qa-db-fra.com

Comment mettre une image au centre de la barre de navigation d'un UIViewController?

J'ai cet extrait de code utilisé dans viewDidLoad d'un UIViewController. Je n'ai aucune erreur. Les images existent. J'obtiens l'arrière-plan mais pas l'image. L'image est une sorte de logo.

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;

}
22
sensorario

UINavigationController gère la barre de navigation en examinant la propriété navigationItem du contrôleur de vue le plus haut de la pile de navigation. Donc, pour changer la vue en logo, vous devez le configurer dans le contrôleur de vue qui utilise le logo (c'est-à-dire le contrôleur de vue racine ou un autre qui est poussé sur la pile).

Faites quelque chose comme ceci dans viewDidLoad de votre contrôleur de vue:

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

Dans votre cas, vous définissez le mauvais élément de navigation:

// Oops...
self.navigationController.navigationItem.titleView = logoView;
// Should be this:
self.navigationItem.titleView = logoView;
54
jhabbott

Nous devons d'abord créer une vue dont la taille est identique à celle de la barre de navigation, puis ajouter une vue d'image et définir définir son cadre tel qu'il apparaît au centre de la barre de navigation.Il fonctionne pour toutes les versions d'ios et prend automatiquement la taille du cadre selon l'appareil ( rétine ou normale) et fonctionne comme par magie.

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

Rapide:

var logoImage:UIImage = UIImage(named: "logo_text")!
self.navigationItem.titleView = UIImageView(image: logoImage)
7
Esqarrouth
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
}
}

Voici ce que j'utilise.

Bien sûr, vous devrez peut-être un peu plus de contraintes, afin de ne pas entrer en conflit avec les éléments des boutons de barre droite et gauche.

3
Andrew

Peut-être pas ce que vous vouliez dire, mais je suis tombé sur cette page à la recherche d'un moyen de fournir une image d'arrière-plan centrée pour la barre de navigation, donc au cas où vous ' re ici pour ça ... voici une façon.

Voler un peu de ne autre réponse , vous pouvez diviser votre image en premier plan et en arrière-plan, puis créer une nouvelle image qui étire l'arrière-plan et centre le premier plan, puis définissez-la comme image d'arrière-plan de votre barre de navigation. La construction de l'image fonctionne comme suit:

// 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
beOn

Vous spécifiez juste son cadre par

logoView.frame = CGRectMake(initialize frame here);

Ensuite, utilisez ce qui suit

[self.navigationItem setTitleView:logoView];
1
manujmv
func centeredNavBarImage (){
    let navcontroller = navigationController!
    let image = #imageLiteral(resourceName: "yourImage")
    let imageView = UIImageView(image:image)

    let bannerWidth = navcontroller.navigationItem.accessibilityFrame.size.width
    let bannerHeight = navcontroller.navigationBar.frame.size.height


    let bannerX = bannerWidth / 2 - image.size.width / 2
    let bannerY = bannerHeight / 2 - image.size.height / 2

    imageView.frame = CGRect(x: bannerX, y: bannerY, width: bannerWidth, height: bannerHeight)
    imageView.contentMode = .scaleAspectFit

    navigationItem.titleView = imageView

}

Il s'agit d'un code modifié de https://youtu.be/bLkuu_fmls

Le bannerWidth prend en compte un élément du bouton d'actualisation que j'ai sur le côté droit de la barre de navigation. Semble fonctionner.

Exécutez la fonction sur ViewDidLoad

0
Steve B