2017-12-17 2 views
-1

Ich weiß, es gibt unzählige ähnliche Fragen dazu, die entweder alle dazu führen, flexible Höhe/Breite zu verwenden oder settingsAutoresizingMaskIntoConstraints auf false zu setzen.Unteransicht skalieren, wenn Superview fertig geladen wird

Ich habe eine Ansicht hinzufügen, eine Erweiterung mit I erstellt:

extension UIView { 
    func addView(storyboard: String, viewIdentier: String) { 
     let story = UIStoryboard(name: storyboard, bundle: nil) 
     let subview = story.instantiateViewController(withIdentifier: viewIdentifier) 
     subview.view.frame = self.bounds 
     self.addSubview(subview.view) 
    } 
} 

Wenn ich diese verwenden, um einen Blick zu initialisieren, in dem ViewDidAppear alles funktioniert. Aber wenn es in der Ansicht geladen wurde, dann sind die Einschränkungen überall, weil die contrainView, die die Ansicht enthält, ihre eigenen Bedingungen hat, die noch nicht geladen sind.

Ich verwende derzeit wie folgt aus:

@IBOutlet weak var container: UIView! 

override func viewDidLoad() { 
    container.addView(storyboard: "Modules", viewIdentifier: "subview") 
} 

Ich will nicht die Ansicht in der ViewDidAppear aus Gründen initialisieren. Gibt es eine Möglichkeit, dies zu beheben, so dass es wie erwartet funktioniert? Oder laden Sie die Subview-Einschränkungen neu, nachdem die Superview geladen wurde?

Auch ich habe wirklich versucht, andere Lösungen zu verwenden. Ich kann diese Arbeit nicht so machen, würde wirklich etwas Hilfe schätzen.

Antwort

1

Es gibt keine Möglichkeit, Dinge in der fest codierten Weise zu tun, die Ihr Code vorschlägt. Sie legen den Rahmen der Unteransicht basierend auf self.bounds fest. Aber in viewDidLoad, wissen wir noch nicht den endgültigen Wert für self.bounds. Es ist zu früh.

Der geeignete Ort, um etwas zu tun, das von der Kenntnis der Layoutwerte abhängt, ist nach dem Layout, nämlich in viewDidLayoutSubviews. Beachten Sie, dass dies im Laufe der Laufzeit der App oft aufgerufen werden kann. Sie möchten die Unteransicht nicht jedes Mal neu hinzufügen. Verwenden Sie daher ein Bool-Flag, um sicherzustellen, dass Sie die Unteransicht nur einmal hinzufügen. Möglicherweise müssen Sie bei nachfolgenden Größenanpassungen der Superview in viewDidLayoutSubviews etwas anderes tun, um entsprechende Anpassungen an der Unteransicht vornehmen zu können.

Aber der richtige Weg, um diese Art der Sache zu tun ist, um die Subview (möglicherweise in viewDidLoad) und geben Sie ihm Einschränkungen hinzufügen, so dass sein Rahmen von nun an korrekt in Bezug auf seine Super bleiben unabhängig wann und wie die Superview in der Größe verändert wird. Sie scheinen in Ihrer Frage diese Art von Ansatz aus der Hand zu weisen, aber es ist dennoch das Richtige, und Sie sollten Ihren Widerstand dagegen fallen lassen.

+0

Haha! Okay Matt. Danke für den Hinweis. Ich hatte das Gefühl, dass das die Antwort sein würde. – LateNate

+0

Ich hatte das Gefühl, du hattest dieses Gefühl ...! :) Aber ich hoffe zumindest, dass du jetzt verstehst, warum dein Weg zum Scheitern verurteilt war und warum der richtige Weg ist, eine Art Live-Reaktion auf die Größenänderung zu konfigurieren. – matt

Verwandte Themen