Могу ли я установить изображение в качестве заголовка для UINavigationBar? - PullRequest
66 голосов
/ 14 ноября 2008

Можно ли установить какое-либо изображение в качестве заголовка панели навигации?

Я думаю, что приложение NYTimes использовало панель навигации, и заголовок выглядит как файл изображения (причина, по которой он кажется UINavigationBar, в том, что они используют правую кнопку для поиска).

Ответы [ 16 ]

127 голосов
/ 14 ноября 2008

Вы можете использовать UIImageView для свойства UINavigationItem.titleView, например:

self.navigationItem.titleView = myImageView;
16 голосов
/ 23 февраля 2009

Я считаю, что прозрачный .png с высотой около 35 пикселей работал хорошо.

- (void)awakeFromNib {

//put logo image in the navigationBar

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

}
12 голосов
/ 13 марта 2016

Вы можете сделать это прямо из раскадровки (начиная с Xcode 7):

  1. Создание вида вне основного вида контроллера вида. Это может быть вложенный вид или просто изображение
  2. Добавить элемент навигации в контроллер вида
  3. Ctrl + перетаскивание от элемента навигации и падение на внешнем виде

enter image description here

4.Выберите вид заголовка

enter image description here

8 голосов
/ 17 ноября 2008

Я создал пользовательскую категорию для UINavigationBar следующим образом

UINavigationBar + CustomImage.h

#import <UIKit/UIKit.h>

@interface UINavigationBar (CustomImage)
    - (void) setBackgroundImage:(UIImage*)image;
    - (void) clearBackgroundImage;
    - (void) removeIfImage:(id)sender;
@end

UINavigationBar + CustomImage.m

#import "UINavigationBar+CustomImage.h"

@implementation UINavigationBar (CustomImage)

- (void) setBackgroundImage:(UIImage*)image {
    if (image == NULL) return;
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    imageView.frame = CGRectMake(110,5,100,30);
    [self addSubview:imageView];
    [imageView release];
}

- (void) clearBackgroundImage {
    NSArray *subviews = [self subviews];
    for (int i=0; i<[subviews count]; i++) {
        if ([[subviews objectAtIndex:i]  isMemberOfClass:[UIImageView class]]) {
        [[subviews objectAtIndex:i] removeFromSuperview];
    }
   }    
}

@end    

Я вызываю его из моего UINavigationController

[[navController navigationBar] performSelectorInBackground:@selector(setBackgroundImage:) withObject:image];
7 голосов
/ 01 октября 2012

Эта строка будет работать для вас, я всегда использую это

[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"imageNavBar.png"]  forBarMetrics:UIBarMetricsDefault];
5 голосов
/ 17 июня 2015

Это тоже хорошо работает

[self.navigationController.navigationBar.topItem setTitleView:[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"YourLogo"]]];
5 голосов
/ 09 января 2009

Я изменил UINavigationBar + CustomImage.m, чтобы заголовок оставался видимым для пользователя. Просто используйте insertSubview: atIndex: вместо addSubview:

UINavigationBar + CustomImage.m

#import "UINavigationBar+CustomImage.h"

@implementation UINavigationBar (CustomImage)

- (void) setBackgroundImage:(UIImage*)image {
    if (image == NULL) return;
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    imageView.frame = CGRectMake(0, 0, 320, 44);
    [self insertSubview:imageView atIndex:0];
    [imageView release];
}

- (void) clearBackgroundImage {
    NSArray *subviews = [self subviews];
    for (int i=0; i<[subviews count]; i++) {
        if ([[subviews objectAtIndex:i]  isMemberOfClass:[UIImageView class]]) {
        [[subviews objectAtIndex:i] removeFromSuperview];
    }
   }    
}

@end
3 голосов
/ 15 декабря 2016

Сделайте это быстро, используя раскадровку и @IBDesignable:

@IBDesignable class AttributedNavigationBar: UINavigationBar {

    @IBInspectable var imageTitle: UIImage? = nil {

        didSet {

            guard let imageTitle = imageTitle else {

                topItem?.titleView = nil

                return
            }

            let imageView = UIImageView(image: imageTitle)
            imageView.frame = CGRect(x: 0, y: 0, width: 40, height: 30)
            imageView.contentMode = .scaleAspectFit

            topItem?.titleView = imageView
        }
    }
}

Затем в инспекторе атрибутов просто выберите изображение:

enter image description here

и подождите секунду для результата:

enter image description here

Таким образом, настройка представления находится там, где она должна быть ... в раскадровке.

2 голосов
/ 20 июня 2016

Для тех, у кого такая же ошибка, но в Xamarin Forms, решение состоит в том, чтобы создать приложение Renderer в iOS и установить изображение следующим образом:

[assembly: Xamarin.Forms.ExportRenderer(typeof(Xamarin.Forms.Page), typeof(MyApp.Renderers.NavigationPageRenderer))]
namespace MyApp.Renderers
{
    #region using

    using UIKit;
    using Xamarin.Forms.Platform.iOS;

    #endregion

    public class NavigationPageRenderer : PageRenderer
    {
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();
            SetTitleImage();
        }

        private void SetTitleImage()
        {
            UIImage logoImage = UIImage.FromFile(ResourceFiles.ImageResources.LogoImageName);
            UIImageView logoImageView = new UIImageView(logoImage);

            if (this.NavigationController != null)
            {
                this.NavigationController.NavigationBar.TopItem.TitleView = logoImageView;
            }
        }
    }
}

Надеюсь, это кому-нибудь поможет!

0 голосов
/ 19 августа 2016

Добавьте изображение в naviagtionBar с помощью SWIFT , который масштабируется по размеру и обрезается до границ. Вы можете вызвать эту функцию внутри функции viewDidLoad () контроллеров представления.

func setupNavigationBarWithTitleImage(titleImage: UIImage) {

    let imageView = UIImageView(image: titleImage)
    imageView.contentMode = .ScaleAspectFit
    imageView.clipsToBounds = true
    navigationItem.titleView = imageView

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...