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

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

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

Ответ 1

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

self.navigationItem.titleView = myImageView;

Ответ 2

Я нахожу, что прозрачный .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];

}

Ответ 3

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

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

введите описание изображения здесь

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

введите описание изображения здесь

Ответ 4

Я создал пользовательскую категорию для 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];

Ответ 5

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

[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"imageNavBar.png"]  forBarMetrics:UIBarMetricsDefault];

Ответ 6

Я изменил 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

Ответ 7

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

[self.navigationController.navigationBar.topItem setTitleView:[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"YourLogo"]]];

Ответ 8

Для тех, кто имеет ту же ошибку, но в Xamarin Forms, решение заключается в создании приложения Renderer in 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;
            }
        }
    }
}

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

Ответ 9

Сделайте это быстро, используя раскадровку и @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
        }
    }
}

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

введите описание изображения здесь

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

введите описание изображения здесь

Итак, настройка вида там, где это должно быть... в раскадровке.

Ответ 10

Просто используйте

[navController.navigationBar insertSubview:myImage atIndex:0] ;

где myImage имеет тип UIImageView и navController имеет тип UINavigationController

Ответ 11

Я изменил код UINavigationBar + CustomImage для правильной работы без утечки памяти.

- (void)setBackgroundImage:(UIImage *)image
{
    if (! image) return;
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    imageView.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
    [self addSubview:imageView];
    [imageView release];
}

- (void) clearBackgroundImage
{
    // This runs on a separate thread, so give it it own pool
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSArray *mySubviews = self.subviews;

    // Move in reverse direction as not to upset the order of elements in the array
    for (int i = [mySubviews count] - 1; i >= 0; i--)
    {
        if ([[mySubviews objectAtIndex:i] isMemberOfClass:[UIImageView class]])
        {
            [[mySubviews objectAtIndex:i] removeFromSuperview];
        }
    }

    [pool release];
}

Ответ 12

Ниже описано, как вы это сделаете в (Xamarin's) MonoTouch с С#.NET.

Создайте UIViewConvrtoller, который находится в NavigationController, затем вызовите это в любое время:

someNiceViewControllerYouMade.NavigationController.NavigationBar
     .InsertSubview(new UIImageView
     (MediaProvider.GetImage(ImageGeneral.navBar_667x44)),0);

Примечание. MediaProvider - это просто класс, который извлекает изображения.

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

Ответ 13

Если ваши кнопки исчезают, когда вы перемещаетесь взад и вперед по навигации, это исправлено для меня:

NSArray *mySubviews = navigationBar.subviews;
UIImageView *iv = nil;

// Move in reverse direction as not to upset the order of elements in the array
for (int i = [mySubviews count] - 1; i >= 0; i--)
{
    if ([[mySubviews objectAtIndex:i] isMemberOfClass:[UIImageView class]])
    {
        NSLog(@"found background at index %d",i);
        iv = [mySubviews objectAtIndex:i];
        [[mySubviews objectAtIndex:i] removeFromSuperview];
        [navigationBar insertSubview:iv atIndex:0];
    }
}

Ответ 14

ios5.0 представил кучу функций для настройки внешнего вида стандартных элементов. Если вы не хотите использовать ImageView для заголовка, альтернативой будет настройка внешнего вида всех UINavbars с использованием фонового изображения и пользовательского шрифта/цвета.

- (void) customiseMyNav
{
    // Create resizable images
    UIImage *portraitImage = [[UIImage imageNamed:@"nav_bar_bg_portrait"] 
        resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
    UIImage *landscapeImage = [[UIImage imageNamed:@"nav_bar_bg_landscape"] 
        resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];

    // Set the background image
    [[UINavigationBar appearance]  setBackgroundImage:portraitImage forBarMetrics:UIBarMetricsDefault];
    [[UINavigationBar appearance]  setBackgroundImage:landscapeImage forBarMetrics:UIBarMetricsLandscapePhone];

    // set the title appearance
    [[UINavigationBar appearance] setTitleTextAttributes:
        [NSDictionary dictionaryWithObjectsAndKeys:
            [UIColor colorWithRed:50.0/255.0 green:150.0/255.0 blue:100/255.0 alpha:1.0], 
            UITextAttributeTextColor, 
            [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.6], 
            UITextAttributeTextShadowColor, 
            [NSValue valueWithUIOffset:UIOffsetMake(0, -1)], 
            UITextAttributeTextShadowOffset, 
            [UIFont fontWithName:@"Arial-Bold" size:0.0], 
            UITextAttributeFont, 
            nil]];
}

Ответ 15

В MonoTouch вы можете использовать это:

 this.NavigationItem.TitleView = myImageView;

Ответ 16

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

func setupNavigationBarWithTitleImage(titleImage: UIImage) {

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

}