2014-12-02 5 views
8

In der Funktion didFinishLaunchingWithOptions meines Anwendungsdelegaten versuche ich, das Aussehen meiner Navigationsleiste anzupassen.Wie setzt man ein undurchsichtiges 1px hohes Schattenbild für eine UINavigationBar?

[UINavigationBar appearance].translucent = NO; 
[[UINavigationBar appearance] 
    setBackgroundImage:[UIImage 
     imageWithColor:[UIColor whiteColor] 
     size:CGSizeMake(1.0f, 1.0f) 
    ] 
    forBarMetrics:UIBarMetricsDefault 
]; 
[UINavigationBar appearance].shadowImage = [UIImage 
    imageWithColor:[UIColor redColor] 
    size:CGSizeMake(0.5f, 0.5f) 
]; 

Ich erwarte einen 1px hohen undurchsichtigen roten Schatten. Stattdessen bekomme ich einen 2px großen, durchscheinenden roten Schatten. Wie kann es genau so erscheinen, wie ich es möchte? Ich habe die analogen Aussehen Einstellungen zu UITabBar gemacht. Auf der anderen Seite verhält es sich gut.

enter image description here

Die Kategorie-Funktion, die dynamische Bilder erzeugt wird, wie so definiert:

+ (UIImage*)imageWithColor:(UIColor *)color size:(CGSize)size 
{ 
    CGRect rect = CGRectMake(0.0f, 0.0f, size.width, size.height); 
    UIGraphicsBeginImageContext(rect.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetFillColorWithColor(context, [color CGColor]); 
    CGContextFillRect(context, rect); 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return image; 
} 
+0

haben Sie sah in nur einen Schatten auf die CALayer Zugabe? siehe http://stackoverflow.com/questions/805872/how-do-i-draw-a-shadow-under-a-uiview – cmyr

+0

@cmyr '[UINavigationBar Aussehen] .layer.borderWidth = 0.5f; [UINavigationBar Aussehen] .layer.borderColor = [UIColor redColor] .CGColor; 'zeigt nichts unter der Navigationsleiste. – Pwner

+0

hast du die clipsToBounds der Ebene auf NO gesetzt? – cmyr

Antwort

-1

Uh ... ist es das, was Sie wollen?

screenshot

In meiner Ansicht-Controller, habe ich einfach eine UIView mit 1 Pixel Höhe und eine von 44pixels Offset:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    self.view.backgroundColor = [UIColor whiteColor]; 

    [self setupNavBar]; 
} 

-(void)setupNavBar 
{ 
    self.navigationItem.title = @"Contacts"; 

    CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame]; 

    UIView *bar = [[UIView alloc] initWithFrame:CGRectMake(0, 44, applicationFrame.size.width, 1.0)]; 
    bar.backgroundColor = [UIColor redColor]; 

    [self.navigationController.navigationBar addSubview:bar]; 
} 

Sie die Farbe, was Sie wollen ändern können.

+2

IMHO Ich denke, es ist nicht die beste Lösung, eine Unteransicht zu einer Navigationsleiste hinzuzufügen. Es scheint fehleranfällig zu sein (z. B. wenn mehrere Ansichtscontroller versuchen, Ansichten hinzuzufügen oder - esp -, wenn sich die Ansichtshierarchie für Navigationsleisten mit einer aktualisierten Version von iOS ändern könnte). Ich denke, es ist viel sicherer, öffentlich verfügbare Funktionen, ein benutzerdefiniertes Hintergrundbild und UIAppearance-Einstellungen zu verwenden. – auco

15

Sie benötigen einen Grafikkontext zu erstellen, die Retina-aware ist:

let pixelScale = UIGraphicsBeginImageContextWithOptions(fillRect.size, false, UIScreen.main.scale) 

Danach wird dein Schatten Bild 1 physischen Pixel groß geworden.

Hier vollständige Code:

extension UIImage { 

    static func imageWithColor(color: UIColor) -> UIImage { 
     let pixelScale = UIScreen.main.scale 
     let pixelSize = 1/pixelScale 
     let fillSize = CGSize(width: pixelSize, height: pixelSize) 
     let fillRect = CGRect(origin: CGPoint.zero, size: fillSize) 
     UIGraphicsBeginImageContextWithOptions(fillRect.size, false, pixelScale) 
     let graphicsContext = UIGraphicsGetCurrentContext() 
     CGContextSetFillColorWithColor(graphicsContext, color.CGColor) 
     CGContextFillRect(graphicsContext, fillRect) 
     let image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return image 
    } 

} 

auf GitHub:

https://github.com/salutis/swift-image-with-color

+0

Ich würde vorschlagen, die Füllgröße {1, pixelSize} anstelle von {pixelSize, pixelSize} zu machen, sonst erzeugt es einen horizontalen Farbverlauf und die Linie wird in meinem Fall am rechten Punkt transparent. –