Подтвердить что ты не робот

Как разместить изображение в центре навигацииБар UIViewController?

У меня есть этот фрагмент кода, используемый в viewDidLoad UIViewController. У меня нет ошибок. Изображения существуют. Я получаю фон, но не изображение. Изображение является своего рода логотипом.

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;

}
4b9b3361

Ответ 1

UINavigationController управляет навигационной панелью, смотря на свойство navigationItem самого верхнего вида контроллера в стеке навигации. Чтобы изменить представление на логотип, вам нужно установить его в контроллере представления, который использует логотип (т.е. Контроллер корневого представления или другой, который попадает в стек).

Сделайте что-нибудь подобное в viewDidLoad вашего контроллера вида:

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

В вашем случае вы устанавливаете неправильный элемент навигации:

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

Ответ 2

Сначала нам нужно создать представление, размер которого совпадает с размером строки навигации    затем добавьте изображение и установите его фрейм, когда он выглядит в центре    в навигационной панели. Он работает для всех версий ios и    он автоматически принимает размер кадра в соответствии с устройством (сетчатка или нормальная)    и работает как волшебство.

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

Ответ 3

Swift:

var logoImage:UIImage = UIImage(named: "logo_text")!
self.navigationItem.titleView = UIImageView(image: logoImage)

Ответ 4

Возможно, не то, что вы имели в виду, но я столкнулся с этой страницей, ища способ предоставить центрированное фоновое изображение для панели навигации, поэтому, если вы здесь для этого... здесь одним способом.

Немного украя из еще один ответ, вы можете разбить изображение на передний план и фон, а затем создать новое изображение, которое растягивает фон и центрирует передний план, и затем установите это как фоновое изображение навигационной панели. Построение изображения работает так:

// 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();

Ответ 5

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

Вот что я использую.

Конечно, вам может потребоваться немного больше ограничений, чтобы не столкнуться с элементами правой и левой строки.

Ответ 6

Вы просто укажете его фрейм на

logoView.frame = CGRectMake(initialize frame here);

Затем используйте следующий

[self.navigationItem setTitleView:logoView];