it-swarm.com.de

Kann ich ein Bild als Titel für UINavigationBar festlegen?

Ist es möglich, ein Bild als Titel der Navigationsleiste festzulegen?

Ich denke, dass die NYTimes-Anwendung eine Navigationsleiste verwendet hat und der Titel wie eine Bilddatei aussieht (der Grund, warum es UINavigationBar scheint, ist, dass sie mit der rechten Maustaste suchen).

65
Amit Vaghela

Sie können eine UIImageView für die UINavigationItem.titleView-Eigenschaft verwenden, etwa:

self.navigationItem.titleView = myImageView;

Ich finde, dass ein transparentes .png mit ca. 35px Höhe gut funktioniert hat. 

- (void)awakeFromNib {

//put logo image in the navigationBar

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

}
16
Clifton Burt

Sie können es direkt vom Storyboard aus machen (ab Xcode 7):

  1. Erstellen Sie eine Ansicht außerhalb der Hauptansicht des Ansichtscontrollers. Es kann eine verschachtelte Ansicht oder nur ein Bild sein
  2. Fügen Sie Ihrem View-Controller ein Navigationselement hinzu
  3. Strg + Ziehen aus dem Navigationselement und bei Außenansicht ablegen 

 enter image description here

4.Wählen Sie die Titelansicht

 enter image description here

11
Cinoss

Ich habe eine benutzerdefinierte Kategorie für UINavigationBar wie folgt erstellt

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    

Ich rufe es von meinem UINavigationController aus auf

[[navController navigationBar] performSelectorInBackground:@selector(setBackgroundImage:) withObject:image];
8
adam

Diese Zeile wird für Sie funktionieren, ich verwende diese immer

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

Das funktioniert auch gut

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

Ich habe UINavigationBar + CustomImage.m so geändert, dass der Titel für den Benutzer weiterhin sichtbar ist. Verwenden Sie einfach insertSubview: atIndex: anstelle von 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
5
ck.

Mach es schnell mit Storyboard und @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
        }
    }
}

Dann wählen Sie im Attribute-Inspector einfach ein Bild aus:

 enter image description here

und warten Sie eine Sekunde auf das Ergebnis:

 enter image description here

Die Einstellungsansicht ist dort, wo sie sein sollte ... im Storyboard.

Für diejenigen, die den gleichen Fehler haben, aber in Xamarin Forms, besteht die Lösung darin, eine Renderer in iOS-App zu erstellen und das Bild so einzustellen: 

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

Hoffe es hilft jemandem!

2
Dr TJ

In MonoTouch können Sie Folgendes verwenden:

 this.NavigationItem.TitleView = myImageView;
0

Wenn Ihre Tasten verschwinden, wenn Sie durch die Navigation navigieren, wurde dies für mich behoben:

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

Ich habe den Code UINavigationBar + CustomImage geändert, um ordnungsgemäß zu funktionieren, ohne Speicher zu verlieren.

- (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];
}
0
Mr. Propa

Im Folgenden wird beschrieben, wie Sie dies in (Xamarins) MonoTouch mit C # .NET tun würden

Erstellen Sie einen UIViewConvrtoller, der sich in einem NavigationController befindet, und rufen Sie das jederzeit auf:

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

Hinweis: MediaProvider ist nur eine Klasse, die Bilder abruft.

In diesem Beispiel kann die Ansicht die vollständige Navigationsleiste ausfüllen. Außerdem wird der Text für die Elementbeschriftung angezeigt.

0

in ios5.0 wurden eine Reihe von Funktionen eingeführt, um das Erscheinungsbild von Standardelementen anzupassen. Wenn Sie für den Titel keine ImageView verwenden möchten, können Sie das Erscheinungsbild aller UINavbars mithilfe eines Hintergrundbildes und einer benutzerdefinierten Schriftart/Farbe anpassen.

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

Bild zu naviagtionBar hinzufügen mit Swift das skaliert und an Grenzen angepasst wird. Sie können diese Funktion innerhalb der viewDidLoad () - Funktion des View Controllers aufrufen.

func setupNavigationBarWithTitleImage(titleImage: UIImage) {

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

}
0
user3378170

Benutz einfach

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

dabei ist myImage vom Typ UIImageView und navController vom Typ UINavigationController

0
J.Raza