2017-09-13 101 views
10

如何为iOS 11中的大标题NavigationBar设置自定义背景图像?我正在使用我已经分配给storyboard中的navigationControllers的自定义子类。大标题的自定义背景图像iOS 11中的NavigationBar 11

这是我如何创建我的自定义的NavBar:

class CustomNavigationController: UINavigationController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
     self.navigationBar.tintColor = UIColor(red:1, green:1, blue:1, alpha:0.6) 
     self.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white] 
     if #available(iOS 11.0, *) { 
      self.navigationBar.prefersLargeTitles = true 
      self.navigationItem.largeTitleDisplayMode = .automatic 
      self.navigationBar.largeTitleTextAttributes = [NSForegroundColorAttributeName: UIColor.white] 
      self.navigationBar.barTintColor = UIColor.green 
     } 
     self.navigationBar.isTranslucent = false 
     self.navigationBar.setBackgroundImage(#imageLiteral(resourceName: "navigationBarBackground"), for: .default) 
     self.navigationBar.shadowImage = #imageLiteral(resourceName: "navigationBarShadow") 
    } 
} 

奇怪的setBackgroundImage(image, for: .default)没有为大标题的工作。它适用于iOS 10之前,如果我旋转iPhone(并激活小NavBar)背景又回来了吗?

编辑: backgroundImage仍然呈现,但以某种方式隐藏。只有当您开始滚动并且出现“正常”导航栏时,backgroundImage才可见。在这种情况下,barTintColor也完全被忽略。 screenshot GIF

+0

hi @alexkaessner。你有没有找到解决问题的办法..? – Tann

+0

@OceanBlue不! :/我刚刚检查了一下新的NavBar。似乎对于显示的大布局有一个完全不同的观点,但这种观点不会改变。 – alexkaessner

+0

可以设置导航栏背景颜色或bartintcolor。但不幸的是我无法设置导航栏背景图片。这是ios 11的错误吗?你知道什么吗..? – Tann

回答

3

在iOS中11,你不再需要设置的BackgroundImage(删除其声明),如果你使用大标题。相反,你需要使用BarTintColor。

class CustomNavigationController: UINavigationController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
     self.navigationBar.tintColor = UIColor(red:1, green:1, blue:1, alpha:0.6) 
     self.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white] 
     if #available(iOS 11.0, *) { 
      self.navigationBar.prefersLargeTitles = true 
      self.navigationItem.largeTitleDisplayMode = .automatic 
      self.navigationBar.largeTitleTextAttributes = [NSForegroundColorAttributeName: UIColor.white] 
      self.navigationBar.barTintColor = UIColor(red:1, green:1, blue:1, alpha:1) 
     } 
     else { 
      self.navigationBar.setBackgroundImage(#imageLiteral(resourceName: "navigationBarBackground"), for: .default)     
     } 
     self.navigationBar.shadowImage = #imageLiteral(resourceName: "navigationBarShadow") 
     self.navigationBar.isTranslucent = false 
    } 
} 
+1

感谢这篇文章,但这不是一个真正的解决方案。我也测试和分析了一点,似乎我必须坚持传统的导航栏(现在)。 – alexkaessner

5

我通过

删除了setBackgroundImage有同样的问题,固定它,并使用barTint颜色与图案像

let bgimage = imageWithGradient(startColor: UIColor.red, endColor: UIColor.yellow, size: CGSize(width: UIScreen.main.bounds.size.width, height: 1)) 
self.navigationBar.barTintColor = UIColor(patternImage: bgimage!) 

获取图像的渐变色

func imageWithGradient(startColor:UIColor, endColor:UIColor, size:CGSize, horizontally:Bool = true) -> UIImage? { 

    let gradientLayer = CAGradientLayer() 
    gradientLayer.frame = CGRect(x: 0, y: 0, width: size.width, height: size.height) 
    gradientLayer.colors = [startColor.cgColor, endColor.cgColor] 
    if horizontally { 
     gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5) 
     gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5) 
    } else { 
     gradientLayer.startPoint = CGPoint(x: 0.5, y: 0.0) 
     gradientLayer.endPoint = CGPoint(x: 0.5, y: 1.0) 
    } 

    UIGraphicsBeginImageContext(gradientLayer.bounds.size) 
    gradientLayer.render(in: UIGraphicsGetCurrentContext()!) 
    let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return image 
} 
+0

我也试过这个,但我希望图像被拉伸,而不是平铺。我的图像有一个渐变...或者有没有办法改变'patternImage:'的属性? – alexkaessner

+0

更新了我的回答 – oldrinmendez

+0

好吧,我已经测试过了,问题依然存在。如果我旋转iPhone,梯度太短并重复。此外'水平:假'不能正常工作。这只是一个橙色酒吧背景。 – alexkaessner

0

在Xamarin它会是这样的:

this.NavigationBar.BackgroundColor = UIColor.Clear; 

     var gradientLayer = new CAGradientLayer 
     { 
     Frame = new CGRect(0, 0, UIApplication.SharedApplication.StatusBarFrame.Width, 
       UIApplication.SharedApplication.StatusBarFrame.Height + this.NavigationBar.Frame.Height), 
     Colors = new CGColor[] 
       {Constants.Defaults.Navigation.RealBlueColor.ToCGColor(), Constants.Defaults.Navigation.RealBlueColor.ToCGColor()} 
     }; 

     UIGraphics.BeginImageContext(gradientLayer.Bounds.Size); 
     gradientLayer.RenderInContext((UIGraphics.GetCurrentContext())); 
     UIImage image = UIGraphics.GetImageFromCurrentImageContext(); 
     UIGraphics.EndImageContext(); 

     this.View.Layer.InsertSublayer(gradientLayer, 0); 
     this.NavigationBar.BarTintColor = UIColor.FromPatternImage(image); 

this.View.Layer.Insert是可选的。我需要它,当我 “冰壶” 向上和向下导航栏

1

图像试试这个代码(SWIFT 4.0):

在viewDidLoad中()

self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.black] 
if #available(iOS 11.0, *) { 
    self.navigationController?.navigationBar.prefersLargeTitles = true 
    self.navigationItem.largeTitleDisplayMode = .automatic 
    self.navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.black] 
} else { 
    //iOS <11.0 
} 
self.title = "Title" 
self.navigationController?.navigationBar.barTintColor = UIColor(patternImage: #imageLiteral(resourceName: "nav_bg")) 
self.navigationController?.navigationBar.isTranslucent = false 
+0

同样的问题。对你起作用吗? – alexkaessner

0

你需要这个;)

navigationController?.view.backgroundColor = .green 
+0

但我想添加我自己的图像,而不仅仅是一个平坦的颜色。我在这里使用渐变... – alexkaessner