Fire Xcode und für Klarheit Build nur zu sagen, 9.3, Universal-App. Also, vergleichen Sie 9.3 iPads mit 9.3 iPhones. Erstellen Sie Simulator und Geräte - Ausstellung Exponate auf beiden.Erschreckend wirkt sich die layoutIfNeeded-Sequenz auf iPad und iPhone anders aus; wie repariert man?
Die App dreht sich in alle vier Richtungen.
Haben Sie eine typische Situation, wo man so etwas tun ...
@IBOutlet weak var doorHeightPerScreen: NSLayoutConstraint!
var heightFraction:CGFloat = 0.6
{
didSet
{
if (heightFraction > maxHeight) { heightFraction = maxHeight }
if (heightFraction < minHeight) { heightFraction = minHeight }
let h = view.bounds.size.height
spaceshipHeightPerScreen.constant = h * heightFraction
self.view.layoutIfNeeded() // holy! read on....
}
}
Beachten Sie die layoutIfNeeded()
nach der Änderung der Beschränkung.
das typische Beispiel fort, haben Sie so etwas wie
override func viewDidLayoutSubviews()
{
super.viewDidLayoutSubviews()
heightFraction = (heightFraction)
// use "autolayout power" for perfection every pass.
// now that basic height/position is set,
save/load reactive positions...
position detail stuff...
}
Check it out ... Ich war das den ganzen Tag zu tun und passiert nur iPhones zu verwenden.
Interessanterweise brauchen Sie nicht den Aufruf layoutIfNeeded.
@IBOutlet weak var doorHeightPerScreen: NSLayoutConstraint!
var heightFraction:CGFloat = 0.6
{
didSet
{
if (heightFraction > maxHeight) { heightFraction = maxHeight }
if (heightFraction < minHeight) { heightFraction = minHeight }
let h = view.bounds.size.height
spaceshipHeightPerScreen.constant = h * heightFraction
}
}
Funktioniert gut.
Aber am Ende des Tages legte ich es auf ein paar iPads und .... alles kaputt!
Immer wenn Sie Landschaft/Porträt drehen, Probleme.
Nach einem Kopf kratzen, erkannte ich, dass Sie unglaublich brauchen die layoutIfNeeded Anruf, auf iPad. Das ist auf dem IDENTISCHEN OS.
Tatsächlich zeigt das Verhalten unabhängig von der Betriebssystemversion. Und es zeigt für ALLE iPhones/ALLE iPads. WTF!
@IBOutlet weak var doorHeightPerScreen: NSLayoutConstraint!
var heightFraction:CGFloat = 0.6
{
didSet
{
if (heightFraction > maxHeight) { heightFraction = maxHeight }
if (heightFraction < minHeight) { heightFraction = minHeight }
let h = view.bounds.size.height
spaceshipHeightPerScreen.constant = h * heightFraction
self.view.layoutIfNeeded() //MUST HAVE, IN IPAD CASE!!!!!!
}
}
Für mich ist es unglaublich beunruhigend, dass sie anders funktionieren würde.
Was ich frage mich ist, gibt es vielleicht eine Einstellung irgendwo, damit sie gleich funktionieren? Könnte es irgendwie meine Schuld sein?
Gibt es noch andere bekannte Unterschiede zwischen den beiden - oder ist es tatsächlich "bekannt", dass es ein paar Bugs wie diesen gibt?
Ich kann nicht denken, etwas Ungewöhnliches oder Ungewöhnliches habe ich überall, außer die ganze App hat override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask { return .All }
in der ersten Ansicht als normal ist, wenn Sie das Gerät auf den Kopf stellen wollen; Ich bezweifle es verwandt. Ansonsten ist es eine sehr "saubere" App.
Es gab mir ein Glitch-in-the-Matrix-Gefühl - es war erschreckend.
Was könnte das verursachen?
Pro RobM Frage sind die SimulatedMetrics Einstellungen (Registerkarte Attribute) auf dem ersten ViewController ...
Allgemeine Systematik der App: die erste Szene "General" ist Vollbild, die Größe des Gerätes. Es gibt einen Container für "Live", der die gleiche Größe hat (mit "Trailing" usw./Constraints als Null für alle). In Live gibt es eine Containeransicht "Quad", die in der Tat auch die Größe "Live" hat, also auch Vollbild. Quad: UIViewController zeigt das Problem, das ich beschreibe. Quad enthält verschiedene Objekte (Bilder, benutzerdefinierte Steuerelemente usw.), die auf der Ansicht herumliegen. Wenn die App startet, ist alles in Ordnung.
Bei Drehung des Gerätes (oder ähnlich): kurz nach der Änderung der Einschränkung (ich weiß nicht, ob das relevant ist): der layoutIfNeeded
Anruf IST für iPads benötigt (alle iPads), aber ist NICHT benötigt für iPhones (alle iPhones). Das Verhalten ist im Simulator und auf Geräten identisch.
Ein weiteres Beispiel .....
ich ein weiteres erstaunliches Beispiel dafür gefunden.
In einer UICollectionView benutzerdefinierte Zellen (nur einfache statisch große Zellen). Wenn Sie eine Einschränkung ändern (stellen Sie sich vor, die Größe eines Symbols oder eines Produkts zu ändern, das in der Zelle aufgenommen wurde).
AUF IPAD Sie DO haben in layoutIfNeeded
neu einzustellen, um sicherzustellen, oder es nicht auf dem ersten Auftreten der Zelle arbeiten.
Während ON IPHONE verhält es sich auf jeden Fall anders: es wird „das für Sie tun“, vor dem ersten Auftreten der Zelle, wenn Sie es weglassen passieren.
Völlig freaky !!
Ich habe das auf jedem iPad und jedem iPhone getestet. (Auch das ungewöhnliche Verhalten zeigt sich genau auf Geräten oder Simulatoren: Simulator macht keinen Unterschied.)
Verwenden Sie ein Storyboard? Welche Größe haben die Ansichten im Storyboard? –
Ich meine, welche Größe haben deine Szenen im Storyboard? –
Klicken Sie auf den ersten View-Controller in Ihrem Storyboard. Öffnen Sie den Attribute-Inspektor. Was ist die "Größe" unter simulierten Metriken? –