2017-09-13 1 views
10

Wie legen Sie ein benutzerdefiniertes Hintergrundbild für den großen Titel NavigationBar in iOS 11 fest? Ich verwende eine benutzerdefinierte Unterklasse, die ich den navigationControllern im Storyboard zugewiesen habe. Diesebenutzerdefiniertes Hintergrundbild mit großen Titeln NavigationBar in iOS 11

ist, wie ich meine benutzerdefinierte NavBar erstellen:

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") 
    } 
} 

Seltsamer die setBackgroundImage(image, for: .default) nicht für die großen Titel arbeiten. Es funktionierte vorher mit iOS 10 und auch wenn ich das iPhone rotiere (und die kleine NavBar aktiviere) ist der Hintergrund wieder da?

Bearbeiten: Die backgroundImage ist immer noch gerendert, aber irgendwie versteckt. Nur wenn Sie mit dem Scrollen beginnen und die "normale" Navigationsleiste erscheint, ist das backgroundImage sichtbar. Auch die barTintColor wird in diesem Fall komplett ignoriert. screenshot GIF

+0

hi @alexkaessner. Hast du irgendeine Lösung des Problems gefunden? – Tann

+0

@OceanBlue Nein! :/Ich habe gerade die neue NavBar ein wenig inspiziert. Scheint, als ob es eine völlig andere Ansicht für das große gezeigte Layout gibt, aber diese Ansicht ändert sich nicht. – alexkaessner

+0

ist es möglich, Navigationsleiste Hintergrundfarbe oder Bartintfarbe zu setzen. aber leider kann ich das Navigationsleiste Hintergrundbild nicht einstellen. Ist das ein Fehler von iOS 11? Weißt du etwas..? – Tann

Antwort

3

In iOS 11 Sie müssen nicht mehr gesetzt Background (Entfernen ihrer Erklärung), wenn Sie große Titel verwenden. Stattdessen müssen Sie BarTintColor verwenden.

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

Danke für die Post, aber das ist keine echte Lösung. Ich habe auch ein wenig mehr getestet und analysiert und es scheint, als müsste ich mich an die traditionelle Navigationsleiste halten (vorerst). – alexkaessner

5

hatte ich das gleiche Problem, es fixiert

entfernen setBackgroundImage und barTint Farbe mit Musterbild

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!) 

Get Bild mit Farbverlauf

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

Ich habe das auch versucht, aber ich möchte, dass das Bild gestreckt und nicht gekachelt wird. Mein Bild hat einen Farbverlauf ... oder gibt es eine Möglichkeit, diese Eigenschaften für 'patternImage:'? – alexkaessner

+0

meine Antwort aktualisiert – oldrinmendez

+0

Okay, ich habe das jetzt getestet und das Problem ist immer noch die Fliesen. Wenn ich das iPhone rotiere, ist der Gradient zu kurz und wiederholt sich. Auch das 'horizontal: false' funktioniert nicht richtig. Es ist nur ein orangefarbener Bar Hintergrund. – alexkaessner

0

In Xamarin verwenden es wäre so:

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); 

Die this.View.Layer.Insert ist optional. Ich brauche es, wenn ich "Curling" nach oben und unten ein Bild auf dem navigationbar

1

bin Versuchen Sie diesen Code (Swift 4.0):

in 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

Gleiches Problem. Funktioniert es für Sie? – alexkaessner

0

Sie müssen dies;)

navigationController?.view.backgroundColor = .green 
+0

Aber ich möchte mein eigenes Bild und nicht nur eine flache Farbe hinzufügen. Ich benutze hier einen Farbverlauf ... – alexkaessner

Verwandte Themen