Programing

이미지를 제목으로 UINavigationBar로 설정할 수 있습니까?

crosscheck 2020. 11. 13. 07:50
반응형

이미지를 제목으로 UINavigationBar로 설정할 수 있습니까?


일부 이미지를 내비게이션 바의 제목으로 설정할 수 있습니까?

NYTimes 응용 프로그램이 내비게이션 바를 사용하고 제목이 이미지 파일처럼 보입니다 (그것이 보이는 이유 UINavigationBar는 검색에 오른쪽 버튼을 사용하기 때문입니다).


당신이 사용할 수 UIImageView에 대한 UINavigationItem.titleView특성, 같은 :

self.navigationItem.titleView = myImageView;

높이가 약 35px 인 투명한 .png가 잘 작동한다는 것을 알았습니다.

- (void)awakeFromNib {

//put logo image in the navigationBar

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

}

스토리 보드에서 바로 수행 할 수 있습니다 (Xcode 7 기준).

  1. 뷰 컨트롤러의 메인 뷰 외부에 뷰를 만듭니다. 중첩 된보기 또는 이미지 일 수 있습니다.
  2. 뷰 컨트롤러에 탐색 항목 추가
  3. Ctrl + 탐색 항목에서 끌어서 외부보기에 놓기

여기에 이미지 설명 입력

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

이 라인은 당신을 위해 일할 것입니다, 나는 항상 이것을 사용합니다

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

제목이 사용자에게 계속 표시되도록 UINavigationBar + CustomImage.m을 수정했습니다. addSubview 대신 insertSubview : atIndex :를 사용하십시오.

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

이것도 잘 작동합니다

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

스토리 보드 및 @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
        }
    }
}

그런 다음 속성 관리자에서 이미지를 선택하십시오.

여기에 이미지 설명 입력

결과를 기다리십시오.

여기에 이미지 설명 입력

설정보기는 스토리 보드에 있어야합니다.


같은 오류가 있지만에서 사람들을 위해 Xamarin Forms,이 솔루션은을 만드는 것입니다 RendereriOS과 같이 이미지를 응용 프로그램 및 설정 :

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

누군가에게 도움이되기를 바랍니다!


메모리 누수없이 제대로 작동하도록 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's 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];
}

다음은 C # .NET을 사용하는 (Xamarin의) MonoTouch에서이 작업을 수행하는 방법입니다.

Create a UIViewConvrtoller that is in a NavigationController then call this at any time:

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

Note: MediaProvider is just a class that fetches images.

This example allows for the view to fill the full Navigation Bar , and lets the text for the items caption appear too.


If your buttons disappear when you navigate back and forth the navigation, this fixed it for me:

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

Just use

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

where myImage is of type UIImageView and navController is of type UINavigationController


ios5.0 introduced a heap of features to customise the appearance of standard elements. If you didn't want to use an ImageView for the title, an alternative would be to customise the appearance of all UINavbars using a background image and a custom font/colour.

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

In MonoTouch you can use this:

 this.NavigationItem.TitleView = myImageView;

크기에 맞게 조정되고 경계에 맞게 클립되는 SWIFT 를 사용 하여 naviagtionBar에 이미지를 추가 합니다. 뷰 컨트롤러 viewDidLoad () 함수 내에서이 함수를 호출 할 수 있습니다.

func setupNavigationBarWithTitleImage(titleImage: UIImage) {

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

}

참고 URL : https://stackoverflow.com/questions/289441/can-i-set-image-as-a-title-to-uinavigationbar

반응형