2016-12-08 3 views
9

Я пытаюсь изменить фон панели навигации, создав слой и добавив его в качестве подуровня в навигационную панель. Однако это влияет только на панель навигации.Настройка градиента как на панели навигации, так и на панели состояния

1

Я wan't это влияет на всю верхнюю часть экрана. Код включено:

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

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

createGradientLayerWithColors функция возвращает CAGradientLayer для данного кадра.

Что мне не хватает? Заранее спасибо.

EDIT:

Я попытался Натаниэля ответ, но получил это:

problem

Стоит отметить, что это также TableView.

РЕШЕНИЕ:

Я нашел это question, который помог мне решить эту проблему.

Конечный правильно код:

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

Я поместил этот метод в расширение UINavigationController, назвав его initializeNavBarStyle, и он работает очень хорошо! – LargeGlasses

ответ

10

Это, как я управлять им.

Сначала я установить Панель навигации для прозрачна:

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

Затем добавить градиент к виду сзади в строке состояния и панели навигации:

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

Я попробовал ваш ответ, но у него есть некоторые проблемы. Проверьте мои изменения. Ps: Я также использовал другие цвета для эксперимента. – PablodeAcero

+0

@PablodeAcero Я добавил строку в конец прозрачного раздела NavigationBar - попробуйте! – Nathaniel

+1

Эй. Ваш комментарий не исправит проблему, но это помогло мне найти решение. Большое спасибо за Вашу помощь! Я буду отмечать это как правильный ответ, и я обновлю свой вопрос с ответом. – PablodeAcero

0

Мой вариант:

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) 

Это не лучше, просто просто другой способ сделать то же самое.

Смежные вопросы