2014-12-02 20 views
8

Nella mia funzione delFinishLaunchingWithOptions del mio programma, cerco di personalizzare l'aspetto della mia barra di navigazione.Come impostare un'ombra alta 1px opaca per una 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) 
]; 

Mi aspetto un'ombra rossa opaca alta 1 px. Invece mi viene data un'ombra rossa traslucida alta 2px. Come può farlo apparire esattamente come lo voglio? Ho fatto le impostazioni di aspetto analogo a UITabBar. D'altra parte, si comporta bene.

enter image description here

La funzione categoria che crea immagini dinamiche è definito come modo:

+ (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

hai guardato in solo l'aggiunta di un'ombra alla CALayer? vedere http://stackoverflow.com/questions/805872/how-do-i-draw-a-shadow-under-a-uiview – cmyr

+0

@cmyr '[UINavigationBar appearance] .layer.borderWidth = 0.5f; [UINavigationBar appearance] .layer.borderColor = [UIColor redColor] .CGColor; 'non mostra nulla sotto la barra di navigazione. – Pwner

+0

hai impostato le clip del livello su suoni su NO? – cmyr

risposta

-1

Uh ... E 'questo quello che vuoi?

screenshot

A mio controller della vista, ho semplicemente aggiunto un UIView con 1 altezza pixel e un offset di 44pixels:

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

È possibile modificare il colore di quello che vuoi.

+2

IMHO Penso che non sia la soluzione migliore per aggiungere una sottoview a una barra di navigazione. Sembra incline agli errori (ad esempio quando più controller di vista tentano di aggiungere viste o - esp - quando la gerarchia delle viste per le barre di navigazione potrebbe cambiare con una versione aggiornata di iOS). Penso che sia molto più sicuro usare invece funzionalità disponibili pubblicamente, un'immagine di sfondo personalizzata e impostazioni di UIA. – auco

15

È necessario creare un contesto grafico che rappresenta retina-aware:

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

Dopo di che, la vostra immagine ombra diventerà alto 1 pixel fisica.

Ecco il codice completo:

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 
    } 

} 

su GitHub:

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

+0

Mi piacerebbe proporre la dimensione di riempimento {1, pixelSize} invece di {pixelSize, pixelSize}, altrimenti crea un effetto sfumatura orizzontale e la linea diventa trasparente al punto di destra nel mio caso. –