Jak umieścić obraz w centrum paska nawigacyjnego UIViewController?

Mam ten fragment kodu używany w viewDidLoad UIViewController. Nie popełniłem błędów. Obrazy istnieją. Dostaję tło, ale nie Obraz. Obraz jest rodzajem 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;

}
Author: sensorario, 2013-03-04

6 answers

UINavigationController zarządza paskiem nawigacyjnym, patrząc na Właściwość navigationItem kontrolera widoku najwyższego poziomu na stosie nawigacji. Aby zmienić widok na logo, musisz skonfigurować go w kontrolerze widoku, który używa logo (np. kontrolerze widoku głównego lub innym, który zostanie wciśnięty na stos).

Zrób coś takiego w viewDidLoad kontrolera widoku:

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

W Twoim przypadku ustawiasz niewłaściwy element nawigacyjny:

// Oops...
self.navigationController.navigationItem.titleView = logoView;
// Should be this:
self.navigationItem.titleView = logoView;
 50
Author: jhabbott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-04 11:21:40

Najpierw musimy utworzyć widok, który ma rozmiar taki sam jak pasek nawigacji następnie dodaj widok obrazu i ustaw ustaw jego ramkę tak, jak wygląda na środek w nawigacji bar.It działa dla wszystkich wersji ios i automatycznie pobiera rozmiar klatki zgodnie z urządzeniem (siatkówka lub normalny) i działa jak magia.

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
Author: AG29,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-15 05:39:56

Swift:

var logoImage:UIImage = UIImage(named: "logo_text")!
self.navigationItem.titleView = UIImageView(image: logoImage)
 5
Author: Esqarrouth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-10 10:26:13
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
}
}
Oto, czego używam.

Oczywiście możesz potrzebować nieco więcej ograniczeń, aby nie kolidować z prawym I lewym przyciskiem paska.

 3
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-13 14:35:28

Być może nie to miałeś na myśli, ale wpadłem na tę stronę, szukając sposobu na wyśrodkowanie obrazka tła dla paska nawigacyjnego, więc na wypadek, gdybyś tu był... jest jeden sposób.

Kradnąc trochę z innej odpowiedzi , możesz rozbić obraz na pierwszy plan i tło, a następnie zbudować nowy obraz, który rozciąga tło i wyśrodkuje pierwszy plan, a następnie ustawić go jako obraz tła paska nawigacyjnego. Budowanie wizerunku działa jak więc:

// 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
Author: beOn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:02

Wystarczy podać ramkę przez

logoView.frame = CGRectMake(initialize frame here);

Następnie użyj następującego

[self.navigationItem setTitleView:logoView];
 1
Author: manujmv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-04 11:15:39