Wenn Sie im Interface Builder Command+ =gedrückt halten, wird die Größe einer Schaltfläche an den Text angepasst. Ich habe mich gefragt, ob dies programmgesteuert möglich ist, bevor die Schaltfläche zur Ansicht hinzugefügt wurde.
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button.titleLabel setFont:[UIFont fontWithName:@"Arial-BoldMT" size:12]];
[button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
// I need to know the width needed to accomodate NSStringVariable
[button setTitle:NSStringVariable forState:UIControlStateNormal];
// So that I can set the width property of the button before addSubview
[button setFrame:CGRectMake(10, 0, width, fixedHeight)];
[subNavigation addSubview:button];
Antworten:
In Xcode 4.5 und höher kann dies jetzt mithilfe von ' Auto-Layouting / Constraints ' erfolgen.
Hauptvorteile sind:
Einige Nachteile:
Das Coolste ist, dass wir uns darauf konzentrieren können, eine Absicht zu erklären, wie zum Beispiel:
Hier ist ein einfaches Tutorial, um sich mit dem automatischen Layout vertraut zu machen.
Für weitere Details .
Zuerst dauert es einige Zeit, aber es sieht so aus, als ob sich die Mühe lohnt.
quelle
In UIKit gibt es Ergänzungen zur NSString-Klasse, um von einem bestimmten NSString-Objekt die Größe zu erhalten, die es beim Rendern in einer bestimmten Schriftart benötigt.
Docs war hier . Jetzt ist es hier unter Veraltet.
Kurz gesagt, wenn Sie gehen:
... Sie haben den Rahmen der Schaltfläche auf die Höhe und Breite der Zeichenfolge eingestellt, die Sie rendern.
Sie werden wahrscheinlich mit etwas Pufferplatz um diese CGSize experimentieren wollen, aber Sie werden an der richtigen Stelle beginnen.
quelle
Der Weg, dies im Code zu tun, ist:
Wenn Sie eine Unterklasse bilden und zusätzliche Regeln hinzufügen möchten, können Sie Folgendes überschreiben:
quelle
-(CGSize)sizeThatFits:(CGSize)size
.[button setTitle:@"Your text here" forState:UIControlStateNormal];
[button sizeToFit];
Auch wenn Sie den Text später aktualisieren, vergessen Sie nicht, ihn erneut aufzurufen.sizeToFit()
Titelkanteneinfügungen werden nicht berücksichtigt.Wenn Ihre Schaltfläche mit Interface Builder erstellt wurde und Sie den Titel im Code ändern, können Sie Folgendes tun:
quelle
Schnell:
Das Wichtigste dabei ist, wann Sie das aufrufen
.sizeToFit()
. Dies sollte nach dem Einstellen des anzuzeigenden Texts geschehen, damit es die erforderliche Größe lesen kann. Wenn Sie den Text später aktualisieren, rufen Sie ihn erneut auf.quelle
Um dies mithilfe des automatischen Layouts zu erreichen, legen Sie eine Einschränkung für die variable Breite fest:
Sie können auch Ihre anpassen müssen
Content Hugging Priority
undContent Compression Resistance Priority
die Ergebnisse , die Sie brauchen.UILabel passt sich automatisch an :
Dieses UILabel wird einfach so eingestellt, dass es auf dem Bildschirm zentriert ist (nur zwei Einschränkungen, horizontal / vertikal):
Die Breite ändert sich vollautomatisch:
Sie müssen nicht festlegen müssen jede Breite oder Höhe - es ist vollautomatisch.
Beachten Sie, dass die kleinen gelben Quadrate einfach angebracht werden ("Abstand" von Null). Sie werden automatisch verschoben, wenn die Größe des UILabel geändert wird.
Durch Hinzufügen einer "> =" - Einschränkung wird eine Mindestbreite für das UILabel festgelegt:
quelle
Wenn Sie die Größe des Textes im Gegensatz zur Schaltfläche ändern möchten, können Sie ...
quelle
sizeToFit funktioniert nicht richtig. stattdessen:
Sie können
contentInset
der Schaltfläche auch Folgendes hinzufügen :myButton.contentEdgeInsets = UIEdgeInsetsMake(8, 8, 4, 8)
quelle
Einfach:
UIView
als Wrapper mit automatischem Layout für Ansichten in der Umgebung.UILabel
innerhalb dieser Wrapper. Fügen Sie Einschränkungen hinzu, mit denen Ihr Etikett an den Kanten des Deckblatts befestigt wird.UIButton
in Ihren Wrapper und fügen Sie dann einfach die gleichen Einschränkungen hinzu, für die Sie es getan habenUILabel
.quelle
Swift 4.2
Gott sei Dank, das gelöst. Nachdem Sie einen Text für die Schaltfläche festgelegt haben, können Sie intrinsicContentSize, die natürliche Größe, aus einer UIView abrufen (das offizielle Dokument befindet sich hier ). Für UIButton können Sie es wie unten verwenden.
Zu Ihrer Information habe ich die Breite angepasst, damit sie richtig aussieht.
Simulator
UIButtons mit intrinsicContentSize
Quelle: https://riptutorial.com/ios/example/16418/get-uibutton-s-size-strictly-based-on-its-text-and-font
quelle
Ich habe einige zusätzliche Bedürfnisse im Zusammenhang mit diesem Beitrag,
sizeToFit
die nicht gelöst werden können. Ich musste die Schaltfläche unabhängig vom Text an ihrer ursprünglichen Position zentrieren. Ich möchte auch nie, dass der Knopf größer als seine ursprüngliche Größe ist.Also gestalte ich die Schaltfläche auf ihre maximale Größe, speichere diese Größe im Controller und verwende die folgende Methode, um die Größe der Schaltfläche zu ändern, wenn sich der Text ändert:
quelle
Diese Schaltflächenklasse mit automatischer Größenanpassung für Text (für Xamarin, kann jedoch für eine andere Sprache umgeschrieben werden)
quelle
Aus irgendeinem Grund
func sizeToFit()
funktioniert das bei mir nicht. Mein Setup ist, dass ich eine Schaltfläche in a verwendeUITableViewCell
und das automatische Layout verwende.Was für mich funktioniert hat ist:
intrinsicContentSize
Breite, weil laut diesem Dokument das automatische Layout nicht bekannt istintrinsicContentSize
. Stellen Sie die Breitenbeschränkung auf dieintrinsicContentSize
Breite einHier sind zwei Titel aus dem
Debug View Hierachry
quelle
Um ehrlich zu sein, finde ich es wirklich schade, dass es im Storyboard kein einfaches Kontrollkästchen gibt, das besagt, dass Sie die Größe der Schaltflächen ändern möchten, um den Text aufzunehmen. OK Was solls.
Hier ist die einfachste Lösung mit Storyboard.
Platzieren Sie UILabel in UIView. Legen Sie Einschränkungen fest, um es an Kanten von UIView anzuhängen.
Platzieren Sie Ihren UIButton in UIView. Legen Sie dieselben Einschränkungen fest, um es an die Ränder von UIView anzuhängen.
Setzen Sie 0 für die Anzahl der Zeilen von UILabel.
Richten Sie die Steckdosen ein.
quelle