Warum ist die Bildbreite der Ansicht immer 600 mal 600 mit automatischem Layout?

7

Ich mache eine grundlegende Minesweeper-App zum Üben / Spaß in swift. Ich möchte es so machen, dass die Größe des Boards (10 Kacheln breit) sich an jeden iOS-Bildschirm anpasst.

Um dies zu tun, setze ich die Größe jeder Kachel, indem ich meine tileContainer view.frame.width und / 10.

Mein Problem ist, dass die Ansicht "tileContainer" auf 600 gesetzt ist, egal was passiert. Auf meinem Storyboard setze ich den tileContainer gleich der Breite des View Containers, indem ich CTR click & amp; Ziehen Sie zur Ansicht und wählen Sie die gleiche Breite. Dadurch bleibt die Breite von tileContainer auf 600 eingestellt, unabhängig von dem Gerät, auf dem ich teste. (was mein Problem ist, sollte die Breite je nach Bildschirmbreite nicht konstant 600 ändern)

Weiß jemand, wie ich die richtige Breite des Bildschirms unabhängig von dem Gerät erhalten kann, auf dem es verwendet wird?

    
Evan Nudd 14.05.2015, 02:50
quelle

3 Antworten

16

Wenn Sie das automatische Layout verwenden, werden die Teilansichten nach der Funktion viewDidLayoutSubviews angeordnet. Wenn Sie tileContainer.frame.size vor diesem Aufruf aufrufen, z. B. in viewDidLoad , ist dies immer 600 zu 600 (das ist die Standardgröße im Storyboard).

  

viewDidLayoutSubviews : Wird aufgerufen, um den View-Controller zu benachrichtigen, dass seine Ansicht gerade seine Unteransichten angelegt hat. Referenz

%Vor%     
Yuchen Zhong 14.05.2015, 03:23
quelle
3

Während die angenommenen Antworten eine richtige Antwort sind, dachte ich, ich könnte zumindest sagen, dass Sie die Ansicht zwingen können, sich selbst zu zeichnen, bevor Sie viewDidAppear :.

treffen

Entweder können Sie in Ihrem viewDidLoad: -Aufruf:

view.setNeedsLayout()
view.layoutIfNeeded()

Oder wenn Sie es von "außerhalb" erstellen:

let vc = UIViewController()
let _ = vc.view

oder

let vc = UIViewController()
vc.view.setNeedsLayout()
vc.view.layoutIfNeeded()

    
user023 02.11.2016 13:04
quelle
2

Kurze Antwort: UIScreen.mainScreen (). bounds.size.width gibt immer die Breite des Bildschirms zurück.

Lange Antwort: Es klingt, als ob Sie das automatische Layout mit Größenklassen verwenden. Sie können dies alles nur mithilfe von Einschränkungen arbeiten. Sie können eine proportionale Beschränkung für Breite und Höhe von Ihrer Kachel zu Ihrem Container festlegen, sodass die Kachel 10% der Breite und Höhe des Containers beträgt. Dann können Sie alle anderen Kacheln so einstellen, dass sie dieselbe Breite und Höhe wie diese Kachel haben. Verwenden Sie dann Einschränkungen, um sie in einem Raster zu positionieren.

Eine andere Strategie, die das automatische Layout verwendet, besteht darin, den Abstand zwischen den Zellen auf 0 zu setzen und die Breite und Höhe frei zu lassen. Wenn Sie 10 Zellen mit 0 Abstand zwischen den Zellen und 0 Abstand zwischen den vorderen und hinteren Zellen und dem Container haben, dann nehmen sie automatisch 1/10 der Breite des Containers an.

Zusätzliche Anmerkung: Wenn Sie Größenklassen / automatisches Layout verwenden, wird die Ansichtsgröße erst richtig festgelegt, wenn Teilansichten angeordnet sind. Wenn Sie also beispielsweise in viewDidLoad versuchen, diese Breite zu verwenden, wäre die Breite immer noch die Breite der Any Any Größenklasse (600).

    
Will M. 14.05.2015 03:26
quelle

Tags und Links