2017-09-13 41 views
10

Jak ustawić niestandardowy obraz tła dla dużego tytułu nawigacyjnego w systemie iOS 11? Używam niestandardowej podklasy, która została przypisana do navigationControllers w scenorysie.Niestandardowy obraz tła z dużymi tytułami NawigacjaBar w systemie iOS 11

ten sposób tworzę własny 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") 
    } 
} 

Dziwnie setBackgroundImage(image, for: .default) nie działa dla dużych tytułów. To zadziałało wcześniej w systemie iOS 10, a także, jeśli obrócę iPhone'a (i aktywuję mały NavBar), wróci tło?

Edytuj: Nadal jest renderowany, ale jakoś ukryty. Tylko jeśli zaczniesz przewijać i pojawi się "normalny" pasek nawigacji, obraz tła będzie widoczny. Również w tym przypadku barTintColor jest całkowicie ignorowany. screenshot GIF

+0

hi @alexkaessner. czy znalazłeś jakieś rozwiązanie problemu? – Tann

+0

@OceanBlue Nie! :/Właśnie sprawdziłem nowy NavBar. Wygląda na to, że prezentowany duży układ jest zupełnie inny, ale ten widok się nie zmienia. – alexkaessner

+0

można ustawić kolor tła paska nawigacyjnego lub bartintcolor. ale niestety nie mogę ustawić obrazu tła paska nawigacyjnego. Czy to błąd ios 11? Czy wiesz coś ...? – Tann

Odpowiedz

3

W iOS 11 Ci nie więcej potrzeba ustawić BackgroundImage (Usuń swoją deklarację), jeśli używasz dużych tytułów. Zamiast tego musisz użyć 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

Dzięki za wiadomość, ale to nie jest prawdziwe rozwiązanie. Przetestowałem i przeanalizowałem trochę więcej i wydaje mi się, że muszę trzymać się tradycyjnego paska nawigacyjnego (na razie). – alexkaessner

5

miałem ten sam problem, poprawiony przez

Usuń setBackgroundImage i używać barTint kolor z wzorem obrazek

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 image z gradient kolorów

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

Próbowałem również tego, ale chcę, aby obraz był rozciągnięty, a nie kafelkowany. Mój obraz ma gradient ... lub czy istnieje sposób na zmianę tych właściwości dla 'patternImage:'? – alexkaessner

+0

zaktualizowałem moją odpowiedź – oldrinmendez

+0

Okej, przetestowałem to teraz, a problemem jest nadal kafelkowanie. Jeśli obrócę iPhone'a, gradient jest zbyt krótki i powtarza się. Również "przeciwnie: false" nie działa poprawnie. To tylko pomarańczowy pasek tła. – alexkaessner

0

W Xamarin to byłoby tak:

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

The this.View.Layer.Insert jest opcjonalny. Muszę go, kiedy jestem "zwijaniu się" w górę iw dół obrazu na NavigationBar

1

Spróbuj tego kodu (Swift 4.0):

w 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

Ten sam problem. Czy Ci to pasuje? – alexkaessner

0

Trzeba to;)

navigationController?.view.backgroundColor = .green 
+0

Ale chcę dodać własny obraz, a nie tylko płaski kolor. Używam tutaj gradientu ... – alexkaessner