2016-10-14 16 views
0

So habe ich eine Ansicht und ein Etikett in meiner Hauptansicht. Die Ansicht ist sowohl horizontal als auch vertikal zentriert. Derzeit ist das Label auf 60 Pixel vom oberen Bildschirmrand eingestellt. Aber auf dem iPhone 4S sieht es ziemlich schlecht aus. Das Etikett ist viel zu nah an der Ansicht.iOS Layout Xcode 8

Ich habe versucht, es so nur auf dem iPhone 4S zu setzen, es wäre 30 Pixel von der Spitze, aber ich denke, dass ich die Größenklasse anstatt nur dieses eine Gerät einstellte.

Also meine Fragen sind das. Erstens gibt es eine gute Möglichkeit, mein Layout für bestimmte Geräte anzupassen? Zweitens gibt es eine Möglichkeit, dieses Label in der Mitte zwischen dem oberen Bildschirmrand und dem oberen Bildschirmrand zu zentrieren.

Auch nur als Referenz ist dies alles in vertikaler Ausrichtung.

Antwort

1

Sie möchten im Allgemeinen vermeiden, Layoutbeschränkungen für bestimmte Geräte hinzuzufügen. Größenklassen und Orientierungen sind besser, weil sie flexibler sind. Wenn Sie dies jedoch wirklich tun müssen (und in einigen Fällen kann es unvermeidlich sein, wenn Sie ein wirklich spezifisches Layout haben), können Sie und ein paar andere Mechanismen dazu verwenden (einschließlich einfach die Größe des Bildschirms zu erhalten und zu vergleichen Gegen die bekannte Höhe, die in diesem Fall 480 Punkte beträgt, verwenden Sie einfach diesen Code in einer if-Anweisung, wenn Sie Ihre Einschränkungen festlegen und entsprechend ändern. Sie müssen Ihre Einschränkungen in Code einrichten, damit dies funktioniert.

Wie für Ihre zweite Frage gibt es ein paar Möglichkeiten, um eine Ansicht auf diese Weise zu zentrieren, die am häufigsten kommt mit einem UILayoutGuide (oder wenn Sie < iOS 9, eine unsichtbare Spacer-Ansicht unterstützen) Tun Sie dies in Interface Builder oder in Code ziemlich einfach. So etwas sollte es tun:

// Assuming you have a view called topView, a root view which are already configured and a myLabel view, this code only covers the vertical aspect of the layout 

let guide1 = UILayoutGuide() 
view.addLayoutGuide(guide1) 
let guide2 = UILayoutGuide() 
view.addLayoutGuide(guide2) 

// space above the label 
guide1.topAnchor.constraint(equalTo: topView.bottomAnchor).isActive = true 
// space below the label 
guide2.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true 
// make the spaces equal 
guide1.heightAnchor.constraint(equalTo: guide2.heightAnchor).isActive = true 

myLabel.topAnchor.constraint(equalTo: guide1.bottomAnchor).isActive = true 
myLabel.bottomAnchor.constraint(equalTo: guide2.topAnchor).isActive = true 
+0

Ja, ich würde es vorziehen, wenn möglich, meine gesamte Oberfläche in der Storyboard-Datei arbeiten zu lassen. Je weniger ich im Code in Bezug auf die Schnittstelle tun muss, desto besser. Ist das möglich oder nicht? –

+0

Es sieht so aus, als ob Interface Builder 'UILayoutGuide' noch nicht unterstützt, aber das ist in Ordnung. Sie können einfach die alte Route wählen und stattdessen unsichtbare Ansichten hinzufügen. Fügen Sie Ihrem Storyboard also nur zwei unsichtbare Ansichten hinzu und verankern Sie sie wie oben im Code angegeben. Eins unter deinem Label, eins darüber und gleiche Höhe. [Hier ist eine Antwort] (http://stackoverflow.com/questions/13075415/evenly-space-multiple-views-within-a-container-view), die im Detail darauf eingeht. – Dima