2013-03-04 7 views
18

У меня есть этот фрагмент кода, используемый в viewDidLoad UIViewController. У меня нет ошибок. Изображения существуют. Я получаю фон, но не изображение. Изображение - своего рода логотип.Как разместить изображение в центре навигацииБар 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; 

} 
+0

если вы положили изображение (логотип) центра навигационной панели, то wht about u r title? – Hari1251

+0

Вам нужно настроить элемент навигации контроллера просмотра, который попадает в стек навигации, а не элемент навигации самого навигационного контроллера. См. Мой ответ. – jhabbott

ответ

47

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; 
+4

Какой размер UIImage должен быть для заголовка? я пробовал с 180 * 40, но он размывается. – Krunal

+0

С тех пор, как OP и ответ, но я повесил трубку на это: 'self.navigationItem.titleView = logoView' следует использовать вместо' self.navigationController.navigationBar.topItem.titleView = logoView', когда новый 'UIViewController' потому что 'topItem' не отражает новый контроллер представлений, который был нажат до появления' viewDidAppear' (он все еще отражает старый контроллер представления в 'viewDidLoad' и' viewWillAppear'). – spurgeon

+0

Кто-нибудь знает рамку titleView? –

1

Вы просто указать это кадр за

logoView.frame = CGRectMake(initialize frame here); 

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

[self.navigationItem setTitleView:logoView]; 
+0

Ваш ответ - правильный ответ, все остальные указывают «как», чтобы поместить изображение в панель навигации. Вопрос четко задает вопрос о том, как центрировать изображение на панели навигации. Спасибо. – oyalhi

+0

Сказав это, у меня есть следующий код; однако он по-прежнему не центрирует изображение. В зависимости от того, что находится на левой/правой стороне навигационной панели, логотип располагается на пустом пространстве, а не на экране. Любые указатели?'let image = UIImage (name:" some_logo ")!' 'let screenWidth = UIScreen.mainScreen(). bounds.width' ' let imageView = UIImageView (frame: CGRect (x: 0, y: 0, width: screenWidth, height: 42)) ' ' imageView.image = image' 'imageView.contentMode = .ScaleAspectFit' – oyalhi

9

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

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

Swift:

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

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

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

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

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

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

+0

После попытки безумного количества ответов ваш, наконец, работал. Спасибо! –

Смежные вопросы