Вопрос по uinavigationbar, ios – Как поместить изображение в центр панели навигации UIViewController?

20

У меня есть этот фрагмент кода, используемого в 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;

}
Вам необходимо установить элемент навигации контроллера представления, который помещается в стек навигации, а не элемент навигации самого контроллера навигации. Смотри мой ответ. jhabbott
Если вы поместите изображение (логотип) в центр навигационной панели, то как насчет названия? Hari1251

Ваш Ответ

7   ответов
3
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
}
}

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

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

Вы просто указываете этоs кадр

logoView.frame = CGRectMake(initialize frame here);

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

[self.navigationItem setTitleView:logoView];
Ваш ответ правильный, все остальные уточняютhow поместить изображение на панель навигации. Вопрос ясно задаетhow to center изображение на панели навигации. Спасибо. oyalhi
Сказав это, у меня есть следующий код; однако, это все еще нецентрировать изображение. В зависимости от того, что находится слева / справа от панели навигации, логотип центрируется на пустом месте, а НЕ на экране. Есть указатели?let image = UIImage(named: "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 и автоматически принимает размер кадра в зависимости от устройства ( сетчатка или нормальная) и работает как по волшебству.

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

}

https://youtu.be/bLkuu_fmlsU

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

Запустите функцию на ViewDidLoad

2

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

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

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

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;
Давно с ОП и ответа, но я зациклился на этом:self.navigationItem.titleView = logoView следует использовать вместоself.navigationController.navigationBar.topItem.titleView = logoView когда новыйUIViewController выталкивается, потому чтоtopItem не отражает новый контроллер представления, который был выдвинут доviewDidAppear срабатывает (он все еще отражает старый контроллер вида вviewDidLoad а такжеviewWillAppear). spurgeon
В предварительном просмотре Xcode откройте изображение. Затем нажмите инструменты -> отрегулируйте размер. Откройте замок и попробуйте сделать его размером около 75 на 75 (пикселей). Тот's рекомендуемый размер по документации Apple Akshansh Thakur
Кто-нибудь знает рамку titleView? Van Du Tran
Как установить клипы в false, чтобы вывести вид за пределы? Takasur
5

Swift:

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

Похожие вопросы