2014-12-02 16 views
8

W mojej funkcji delegata didFinishLaunchingWithOptions próbuję dostosować wygląd paska nawigacji.Jak ustawić nieprzejrzysty obraz wysokiego poziomu 1px dla paska 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) 
]; 

Spodziewam się 1px wysoki nieprzezroczysty czerwony cień. Zamiast tego otrzymuję 2px wysoki półprzezroczysty czerwony cień. Jak sprawić, by wyglądał dokładnie tak, jak tego chcę? Zrobiłem analogiczne ustawienia wyglądu do UITabBar. Z drugiej strony zachowuje się ładnie.

enter image description here

Funkcja kategoria, która tworzy dynamicznych obrazów jest zdefiniowany jako tak:

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

pan spojrzał tylko dodanie cienia do CALayer? zobacz http://stackoverflow.com/questions/805872/how-do-i-draw-a-shadow-under-a-viewview – cmyr

+0

@ cmyr '[UINavigationBar appearance] .layer.borderWidth = 0.5f; [UINavigationBar appearance] .layer.borderColor = [UIColor redColor] .CGColor; 'nic nie pokazuje pod paskiem nawigacji. – Pwner

+0

czy ustawiłeś klipy na klocki na NIE? – cmyr

Odpowiedz

-1

Uh ... Czy to, co chcesz?

screenshot

moim zdaniem kontrolera, po prostu dodał UIView z wysokości 1 piksela i przesunięcie 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]; 
} 

Można zmienić kolor, co chcesz.

+2

IMHO Myślę, że to nie jest najlepsze rozwiązanie, aby dodać podzbiór do paska nawigacji. Wydaje się, że jest podatny na błędy (np. Gdy kontrolery wielu widoków próbują dodać widoki lub - esp - gdy hierarchia widoków dla pasków nawigacyjnych może ulec zmianie w zaktualizowanej wersji systemu iOS). Myślę, że bezpieczniej jest używać publicznie dostępnych funkcji, niestandardowego obrazu tła i ustawień UIAppearance. – auco

15

Trzeba stworzyć kontekst graficzny, który jest świadomy siatkówki:

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

Po tym, twój cień obrazu staną się 1 piksel fizyczny wysoki.

Oto pełny kod:

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 
    } 

} 

Na GitHub:

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

+0

Proponuję zrobić rozmiar wypełnienia {1, pixelSize} zamiast {pixelSize, pixelSize}, w przeciwnym razie powstanie efekt gradientu poziomego, a linia stanie się przezroczysta we właściwym punkcie w moim przypadku. –

Powiązane problemy