2017-09-28 6 views
1

Zuvor hatte ich auf ios 10 den folgenden Code, der perfekt für mich funktioniert. Ich habe gerade UIView mit UIImage + UIView mit spezifischer Farbe hinzugefügt. Nach der Prüfung auf 11 ios fand ich heraus, dass einige der Bildschirme dieses Image auf der Oberseite der Rest UI-Elemente haben, so was ist falsch mit diesemBest Practices zum Hinzufügen von Hintergrundbildern in allen ViewControllern swift ios 11

override func viewDidLoad() { 
    super.viewDidLoad() 

    configureView() 
} 

func configureView() { 
    view.backgroundColor = UIColor.clear 
    let backgroundImage = getBackgroundImage() 
    view.addSubview(backgroundImage) 
    view.sendSubview(toBack: backgroundImage) 
} 

func getBackgroundImage() -> UIView { 
    let backgroundImage = UIImageView(frame: UIScreen.main.bounds) 
    backgroundImage.image = UIImage(named: "lemons") 
    backgroundImage.contentMode = UIViewContentMode.scaleAspectFill 

    let backgroundView = UIView(frame: UIScreen.main.bounds) 
    backgroundView.backgroundColor = black 
    backgroundImage.addSubview(backgroundView) 

    return backgroundImage 
} 

Antwort

0

Wenn Sie Ihren View-Controller programmatisch sind die Erstellung (Was bedeutet: kein Storyboard oder Feder), können Sie ein Hintergrundbild hinzufügen sehr einfach wie folgt aus:

class SomeViewController: UIViewController { 

    override func loadView() { 
     view = UIView() 
     view.frame = UIScreen.main.bounds 
     setBackground() 
    } 

    func setBackground() { 

     // set image 
     let bg = UIImageView() 
     bg.image = // some UIImage 
     bg.frame = view.bounds 
     bg.contentMode = .scaleAspectFill 
     bg.clipsToBounds = true 
     view.insertSubview(bg, at: 0) 

     // set tint 
     let tint = UIView() 
     tint = view.bounds 
     tint = UIColor.red 
     tint = 0.5 
     view.insertSubview(tint, at: 1) 

    } 

} 

Denken Sie daran, wenn Sie einen view-Controller programmatisch erstellen, müssen Sie die view-Controller die aktuelle Ansicht erstellen, dh view = UIView(). Darüber hinaus sollten "Kernaufgaben", wie das Setzen eines Hintergrundbildes, in loadView erledigt werden, und "finishing-touch" -Tasks oder Aufgaben, die ausgeführt werden sollen, nachdem der View-Controller sich vollständig in den Speicher geladen hat, sollten in viewDidLoad ausgeführt werden . Und natürlich sollte das Konfigurieren der View-Eigenschaft des View-Controllers definitiv nicht als letzte erfolgen.

+0

Danke, ich werde versuchen, Ihren Ansatz - der Grund für so viel Codierung - ist, dass auf der Oberseite von iImage möchte ich halbtransparente Sicht platzieren. Und ich habe nicht immer viewContorller programmgesteuert erstellt, vielleicht nur ein paar von ihnen programmgesteuert und der Rest vom Storyboard, das ist wahrscheinlich ein Durcheinander –

+0

Ich aktualisierte die Antwort, um eine Tönungsschicht zu enthalten. Solange Sie das Bild bei 0 und die Farbtonebene bei 1 einfügen, wird alles andere über ihnen hinzugefügt. Es ist auch besser, meinen Code so modular wie möglich zu halten. Anstatt zu versuchen, das Bild und die Tint-Ebene in einer Ansicht zu kombinieren, sollten Sie sie getrennt halten, damit zukünftige Änderungen viel einfacher und Bugs leichter zu erkennen sind. – sconewolf

0

Verschieben configureView() Anruf von viewDidLoad in viewWillLayoutSubviews. Letzteres ist insofern unpraktisch, als es im Laufe der Lebensdauer des View-Controllers oft aufgerufen wird, also eine Bool-Eigenschaft zu überprüfen, so dass Sie erst beim ersten Mal configureView()einmal anrufen.

Verwandte Themen