Ich habe einen UITableViewController, der keine Abschnitte anzeigt, wenn nichts zu zeigen ist. Ich habe eine Beschriftung hinzugefügt, um dem Benutzer anzuzeigen, dass mit diesem Code nichts angezeigt werden kann:
label = UILabel(frame: CGRectMake(20, 20, 250, 100))
label.text = "Nothing to show"
self.tableView.addSubview(label)
Aber jetzt möchte ich, dass es horizontal und vertikal zentriert wird. Normalerweise würde ich die beiden im Screenshot hervorgehobenen Optionen (plus diejenigen für Höhe und Breite) auswählen:
Ich habe den folgenden Code versucht, um die Einschränkungen hinzuzufügen, aber die App stürzt mit einem Fehler ab:
label = UILabel(frame: CGRectMake(20, 20, 250, 100))
label.text = "Nothing to show"
let xConstraint = NSLayoutConstraint(item: label, attribute: .CenterX, relatedBy: .Equal, toItem: self.tableView, attribute: .CenterX, multiplier: 1, constant: 0)
let yConstraint = NSLayoutConstraint(item: label, attribute: .CenterY, relatedBy: .Equal, toItem: self.tableView, attribute: .CenterY, multiplier: 1, constant: 0)
label.addConstraint(xConstraint)
label.addConstraint(yConstraint)
Error:
When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView _viewHierarchyUnpreparedForConstraint:] to debug.
2014-12-23 08:17:36.755 [982:227877] *** Assertion failure in -[UILabel _layoutEngine_didAddLayoutConstraint:roundingAdjustment:mutuallyExclusiveConstraints:], /SourceCache/UIKit/UIKit-3318.16.21/NSLayoutConstraint_UIKitAdditions.m:560
Das Etikett sollte immer horizontal und vertikal zentriert sein, da die App die Drehung des Geräts unterstützt.
Was mache ich falsch? Wie füge ich diese Einschränkungen erfolgreich hinzu?
Vielen Dank!
ios
xcode
swift
autolayout
nslayoutconstraint
Mario A Guzman
quelle
quelle
Antworten:
Update für Swift 3 / Swift 4:
Ab iOS 8 können und sollten Sie Ihre Einschränkungen aktivieren, indem Sie deren
isActive
Eigenschaft auf festlegentrue
. Dadurch können sich die Einschränkungen den richtigen Ansichten hinzufügen. Sie können mehrere Einschränkungen gleichzeitig aktivieren, indem Sie ein Array mit den Einschränkungen an übergebenNSLayoutConstraint.activate()
Bessere Lösung:
Da diese Frage ursprünglich beantwortet wurde, wurden Layoutanker eingeführt, die das Erstellen der Einschränkungen erheblich vereinfachen. In diesem Beispiel erstelle ich die Einschränkungen und aktiviere sie sofort:
oder das gleiche mit
NSLayoutConstraint.activate()
:Hinweis: Fügen Sie Ihre Unteransichten immer zur Ansichtshierarchie hinzu, bevor Sie die Einschränkungen erstellen und aktivieren.
Ursprüngliche Antwort:
Die Einschränkungen beziehen sich auf
self.tableView
. Da Sie die Bezeichnung als Unteransicht von hinzufügenself.tableView
, müssen die Einschränkungen dem "gemeinsamen Vorfahren" hinzugefügt werden:Wie @mustafa und @kcstricks in den Kommentaren betonten, müssen Sie festlegen
label.translatesAutoresizingMaskIntoConstraints
, dassfalse
. Wenn Sie dies tun, müssen Sie auch daswidth
undheight
des Etiketts mit Einschränkungen angeben , da der Rahmen nicht mehr verwendet wird. Schließlich sollten Sie auch festlegentextAlignment
,.Center
dass Ihr Text in Ihrer Beschriftung zentriert ist.quelle
Im Behälter zentrieren
Der folgende Code entspricht der Zentrierung im Interface Builder.
Methode 1: Ankerstil
Methode 2: NSLayoutConstraint-Stil
Anmerkungen
NSLayoutConstraint
Stil. Er ist jedoch nur unter iOS 9 verfügbar. Wenn Sie also iOS 8 unterstützen, sollten Sie ihn weiterhin verwendenNSLayoutConstraint
Stil verwenden.quelle
Das ObjectiveC-Äquivalent lautet:
quelle
Programmgesteuert können Sie dies tun, indem Sie die folgenden Einschränkungen hinzufügen.
quelle
In Swift 5 sieht es so aus:
quelle
Wenn Sie sich nicht dafür interessieren, dass es sich bei dieser Frage speziell um eine Tabellenansicht handelt, und Sie nur eine Ansicht über einer anderen Ansicht zentrieren möchten, gehen Sie wie folgt vor:
quelle
Eine Lösung für mich war, ein zu erstellen
UILabel
und esUIButton
als Unteransicht hinzuzufügen. Schließlich habe ich eine Einschränkung hinzugefügt, um sie innerhalb der Schaltfläche zu zentrieren.quelle