Multiline-UIButton und autolayout
Habe ich eine view-controller, der wie folgt aussieht:
Möchte ich die zwei top-Tasten, um immer über 20 Punkte zwischen sich und die linken/rechten Ränder der gesamten Ansicht. Sie sollten immer die gleiche Breite zu. Ich habe die Einschränkungen, die für das alles und es funktioniert genau wie ich es wollte. Das problem ist das vertikale Beschränkungen. Die Tasten sollten immer 20 Punkte unterhalb der oberen Kante. Sie sollte die gleiche Höhe haben. Allerdings autolayout nicht respektiert, dass die linke label braucht zwei Zeilen so an, dass alle seine Texte, so das Ergebnis sieht wie folgt aus:
Ich will dass es aussieht wie im ersten Bild. Kann ich nicht hinzufügen, Konstante Höhe-Einschränkungen auf die Knöpfe, weil wenn die app läuft auf dem iPad, wird nur eine Zeile benötigt und es wäre eine Verschwendung zu haben, der extra-Platz dann.
In viewDidLoad
habe ich versucht, dieses:
- (void)viewDidLoad
{
[super viewDidLoad];
self.leftButton.titleLabel.preferredMaxLayoutWidth = (self.view.frame.size.width - 20.0 * 3) / 2.0;
self.rightButton.titleLabel.preferredMaxLayoutWidth = (self.view.frame.size.width - 20.0 * 3) / 2.0;
}
Aber nicht ändern anyhting überhaupt.
Die Frage: Wie mache ich autolayout Respekt, dass die linke Taste zwei Zeilen?
- es könnte sein, weil Sie die "gleiche Höhe" - Einschränkung auf die linke Taste. Zu machen, dass es die gleiche Höhe wie die anderen Tasten, das ändern der Größe des Inhalts innerhalb der Schaltfläche
- Ich versucht zu entfernen, die "gleiche Höhe" - Einschränkung, aber es hat nicht funktioniert.
- Haben Sie versucht, hinzufügen >= - Einschränkungen auf den Etiketten, um festzustellen, eine Mindest Einpresstiefe?
- Nein, aber ich habe versucht es jetzt, aber unfortunely es hat nicht funktioniert entweder. Jetzt auf dem iPad sind die Tasten "doppelt hoch", was ich nicht will, dass Sie sein.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte das gleiche problem, wo ich wollte, meine Taste, um zu wachsen zusammen mit Ihrem Titel. Ich musste Unterklasse der
UIButton
und seineintrinsicContentSize
so, dass es den gibt intrinsische Größe des Etiketts.Da die
UILabel
ist mehrzeilig, seineintrinsicContentSize
ist unbekannt, und Sie haben, um IhrepreferredMaxLayoutWidth
Sehen objc.io-Artikel über dasRest des Layouts funktionieren sollte. Wenn Sie Ihre Schaltfläche mit gleichen Höhen, der andere zu wachsen. Der komplette button der sieht so aus
numberOfLines
und rufen Sie den zweiten[super layoutSubviews]
nennen obwohl.override var intrinsicContentSize: CGSize { let labelSize = titleLabel?.sizeThatFits(CGSize(width: self.frame.size.width, height: CGFloat.greatestFiniteMagnitude)) ?? CGSize.zero let reqiredButtonSize = CGSize(width: super.intrinsicContentSize.width, height: labelSize.height + contentEdgeInsets.top + contentEdgeInsets.bottom) return reqiredButtonSize }
Swift 4.1.2 - Version, basierend auf @Jan Antwort.
Dieser Hinsicht content edge-Einsätze und für mich gearbeitet:
Einer einfachen Lösung, die für mich arbeiten: stellen Sie die multiline-Taste, um Ihre Titel in Höhe Swift 4.2 durch hinzufügen einer Einschränkung für die button-Höhe, basierend auf dessen Titel, Bezeichnung, Höhe:
Komplette Klasse in Swift 3 - basierend auf dem @Jan, @Quantaliinuxite und @matt bezark:
AKTUALISIERT Swift/Swift 2.0 version wieder auf @Jan, die Antwort
Anpassungen für Swift-3.1
intrisicContentSize ist eine Eigenschaft, die anstelle der Funktion
fügen Sie die fehlenden Einschränkungen:
Statt layoutSubviews zweimal würde ich berechnen
preferredMaxLayoutWidth
manuellHaben Sie versucht mit diesem:
@Jan, die Antwort nicht für mich in (mindestens) iOS 8.1, 9.0 mit Xcode 9.1. Das problem:
titleLabel
's-intrinsicContentSize
gibt sehr große Breite und geringe Höhe, da es keine Breite limit (titleLabel.frame
auf Abruf hat die Größe null, das führt zu Messungen-problem). Darüber hinaus nicht berücksichtigt mögliche Einsätze und/oder Bild.So, hier ist meine Umsetzung, der sollte fix die ganzen Sachen (nur eine Methode wirklich notwendig ist):
Gibt es eine Lösung ohne Unterklassen auf iOS11. Nur müssen legen Sie eine weitere Einschränkung im code entsprechend der Höhe der
button
undbutton.titleLabel
.ObjC:
Und in einigen Fällen (wie zuvor gesagt):
Swift:
+