2016-12-08 18 views
9

Próbuję zmienić tło paska nawigacyjnego, tworząc warstwę i dodając ją jako podwarstwę do paska nawigacji. Ma to jednak wpływ tylko na pasek nawigacji.Ustawianie gradientu zarówno na pasku nawigacyjnym, jak i na pasku stanu

1

ja wa ona mieć wpływ na całą górną część ekranu. Kod zawiera:

let navBarLayer = StyleUtils.createGradientLayerWithColors(color: StyleUtils.Colors.SKY_BLUE, frame: (self.navigationController?.navigationBar.bounds)!) 

self.navigationController?.navigationBar.layer.addSublayer(navBarLayer) 

createGradientLayerWithColors funkcja zwraca CAGradientLayer dla danej ramki.

Czego mi brakuje? Z góry dziękuję.

EDIT:

Próbowałem Nathaniel odpowiedź, ale mam to:

problem

Warto wspomnieć, że jest to również Tableview.

ROZWIĄZANIE:

Znalazłem to question że pomógł mi rozwiązać problem.

Ostateczna poprawny kod jest:

func setNavBarColor() { 

    let navBar = self.navigationController?.navigationBar 

    //Make navigation bar transparent 
    navBar?.setBackgroundImage(UIImage(), for: .default) 
    navBar?.shadowImage = UIImage() 
    navBar?.isTranslucent = true 

    //Create View behind navigation bar and add gradient 
    let behindView = UIView(frame: CGRect(x: 0, y:0, width: UIApplication.shared.statusBarFrame.width, height: UIApplication.shared.statusBarFrame.height + (navBar?.frame.height)!)) 

    let layerTop = StyleUtils.createGradientLayerWithColors(color: StyleUtils.Colors.SKY_BLUE, frame: behindView.bounds) 
    behindView.layer.insertSublayer(layerTop, at: 0) 

    self.navigationController?.view.insertSubview(behindView, belowSubview: navBar!) 

} 
+0

Umieszczam tę metodę w rozszerzeniu UINavigationController, nazywam ją initializeNavBarStyle i działa naprawdę dobrze! – LargeGlasses

Odpowiedz

10

ten sposób udaje mi go.

Najpierw ustawić NavigationBar do transparent:

self.navigationBar.setBackgroundImage(UIImage(), for: .default) 
self.navigationBar.shadowImage = UIImage() 
self.navigationBar.isTranslucent = true 
self.navigationBar.backgroundColor = UIColor.clear 

Potem dodać gradient do widoku z tyłu na pasku stanu i na pasku nawigacyjnym:

let gradient = CAGradientLayer() 
    gradient.frame = CGRect(x: 0, y: 0, width: UIApplication.sharedApplication().statusBarFrame.width, height: UIApplication.sharedApplication().statusBarFrame.height + self.navigationController!.navigationBar.frame.height) 
    gradient.locations = [0.0,1.0] 
    gradient.colors = [UIColor.anyColor().colorWithAlphaComponent(0.4).CGColor, UIColor.clearColor().CGColor] 
    self.view.layer.addSublayer(gradient) 
    self.view.backgroundColor = UIColor.clear 
+0

Próbowałem twojej odpowiedzi, ale ma ona pewne problemy. Sprawdź moją edycję. Ps: Użyłem także innych kolorów do eksperymentu. – PablodeAcero

+0

@PablodeAcero Dodałem linię na końcu przezroczystej sekcji NavigationBar - spróbuj! – Nathaniel

+1

Hej. Twój komentarz nie naprawił problemu, ale pomógł mi znaleźć rozwiązanie. Bardzo ci dziękuje za pomoc! Zaznaczę to jako poprawną odpowiedź, a ja odpowiem na pytanie. – PablodeAcero

0

Mój opcja:

let gradientLayer = CAGradientLayer() 

let layerY = -UIApplication.shared.statusBarFrame.size.height as CGFloat 

let layerHeight = (self.navigationController?.navigationBar.frame.size.height)! + UIApplication.shared.statusBarFrame.size.height as CGFloat 

gradientLayer.frame = CGRect(x: 0, y: layerY, width: 1366, height: layerHeight) 

gradientLayer.colors = [UIColor(red: 16/255.0, green: 57/255.0, blue: 82/255.0, alpha: 1.0).cgColor, UIColor(red: 17/255.0, green: 132/255.0, blue: 157/255.0, alpha: 1.0).cgColor] 

self.navigationController?.navigationBar.layer.addSublayer(gradientLayer) 

To nie jest lepsze, po prostu inny sposób na zrobienie tego samego.

Powiązane problemy