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;
}
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;
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];
Rapide:
var logoImage:UIImage = UIImage(named: "logo_text")!
self.navigationItem.titleView = UIImageView(image: logoImage)
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.
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();
Vous spécifiez juste son cadre par
logoView.frame = CGRectMake(initialize frame here);
Ensuite, utilisez ce qui suit
[self.navigationItem setTitleView:logoView];
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