Wenn ich einen UIButton mit Autolayout angeordnet habe, passt sich seine Größe gut an den Inhalt an.
Wenn ich ein Bild als button.image
einstelle, scheint dies wieder auf die Instrumentengröße zurückzuführen zu sein.
Wenn ich jedoch titleEdgeInsets
die Schaltfläche optimiere , berücksichtigt das Layout dies nicht und schneidet stattdessen den Schaltflächentitel ab.
Wie kann ich sicherstellen, dass die Eigenbreite der Schaltfläche den Einschub berücksichtigt?
Bearbeiten:
Ich benutze folgendes:
[self.backButton setTitleEdgeInsets:UIEdgeInsetsMake(0, 5, 0, 0)];
Ziel ist es, eine gewisse Trennung zwischen Bild und Text zu erreichen.
ios
cocoa-touch
uiview
uibutton
autolayout
Ben Packard
quelle
quelle
titleEdgeInset
Dokumentation:The insets you specify are applied to the title rectangle after that rectangle has been sized to fit the button’s text. Thus, positive inset values may actually clip the title text.
Wenn Sie also einen Einschub hinzufügen, zwingen Sie die Schaltfläche, den Text sicherAntworten:
Sie können dies lösen, ohne Methoden überschreiben oder eine beliebige Breitenbeschränkung festlegen zu müssen. Sie können alles in Interface Builder wie folgt tun.
Die intrinsische Schaltflächenbreite wird aus der Titelbreite plus der Symbolbreite plus den linken und rechten Inhaltskanteneinfügungen abgeleitet .
Wenn eine Schaltfläche sowohl ein Bild als auch einen Text enthält, werden sie als Gruppe zentriert, ohne dass ein Abstand dazwischen besteht.
Wenn Sie einen linken Inhaltseinsatz hinzufügen, wird dieser relativ zum Text berechnet, nicht zum Text + Symbol.
Wenn Sie einen negativen linken Bildeinsatz festlegen, wird das Bild nach links herausgezogen, die Gesamtbreite der Schaltflächen bleibt jedoch unberührt.
Wenn Sie einen negativen linken Bildeinsatz festlegen, verwendet das tatsächliche Layout die Hälfte dieses Werts. Um einen linken Einschub von -20 Punkten zu erhalten, müssen Sie im Interface Builder einen Wert für den linken Einschub von -40 Punkten verwenden.
Sie stellen also einen ausreichend großen linken Inhaltseinsatz bereit, um Platz für beide gewünschten linken Einfügungen zu schaffen und den inneren Abstand zwischen dem Symbol und dem Text zu schaffen, und verschieben das Symbol dann nach links, indem Sie zwischen dem Symbol und dem Text verdoppeln. Das Ergebnis ist eine Schaltfläche mit gleichen linken und rechten Inhaltseinfügungen und einem Text- und Symbolpaar, die als Gruppe zentriert sind und zwischen denen ein bestimmter Abstand vorhanden ist.
Einige Beispielwerte:
quelle
UIButton
.Sie können dies in Interface Builder zum Laufen bringen (ohne Code zu schreiben), indem Sie eine Kombination aus negativen und positiven Titel- und Inhaltseinfügungen verwenden.
Update : Xcode 7 hat einen Fehler, bei dem Sie keine negativen Werte in das
Right
Feld Einfügen eingeben können , aber Sie können die Schrittsteuerung daneben verwenden, um den Wert zu verringern. (Danke Stuart)Dadurch wird ein Abstand von 8pt zwischen dem Bild und dem Titel hinzugefügt und die intrinsische Breite der Schaltfläche um den gleichen Betrag erhöht. So was:
quelle
Right
Feld.Warum nicht die
intrinsicContentSize
Methode in UIView überschreiben? Beispielsweise:Dies sollte dem Autolayout-System mitteilen, dass die Schaltfläche vergrößert werden soll, um die Einfügungen zu berücksichtigen und den vollständigen Text anzuzeigen. Ich bin nicht an meinem eigenen Computer, daher habe ich dies nicht getestet.
quelle
intrinsicContentSize
ist eine Methode in UIView, nicht in UIButton, sodass Sie keine UIButton-Methoden durcheinander bringen würden. Apple glaubt nicht, dass dies ein Problem ist: "Durch Überschreiben dieser Methode kann eine benutzerdefinierte Ansicht dem Layoutsystem mitteilen, welche Größe sie basierend auf ihrem Inhalt haben möchte." Und das OP sagte nichts über verschiedene Tasten, nur die eine.intrinsicContentSize
ist in der Tat eine Methode in UIView und UIButton ist eine Unterklasse von UIView, sodass Sie diese Methode natürlich überschreiben können. Nichts in Apples Dokumenten sagt, dass Sie nicht sollten. Erstellen Sie einfach eine UIButton-Unterklasse mit der überschriebenen Methode von Maarten und ändern Sie Ihren UIButton im Interface Builder so, dass er vom Typ YourUIButtonSubclass ist, und er funktioniert einwandfrei.intrinsicContentSize
dass UIButton in den titleEdgeInsets hinzufügen sollte, ich werde einen Fehler bei Apple melden.Sie haben nicht angegeben, wie Sie die Einfügungen festlegen. Ich vermute also, dass Sie titleEdgeInsets verwenden, da ich den gleichen Effekt sehe, den Sie erhalten. Wenn ich stattdessen contentEdgeInsets verwende, funktioniert es ordnungsgemäß.
quelle
Und für Swift funktionierte das:
Liebe U Swift
quelle
Dieser Thread ist ein bisschen alt, aber ich bin gerade selbst darauf gestoßen und konnte ihn mit einem negativen Einschub lösen. Ersetzen Sie beispielsweise hier Ihre gewünschten Füllwerte:
In Kombination mit den richtigen Einschränkungen für das automatische Layout erhalten Sie eine Schaltfläche zur automatischen Größenänderung, die ein Bild und einen Text enthält! Unten mit
desiredLeftPadding
10 eingestellt.Sie können sehen, dass der tatsächliche Rahmen der Schaltfläche die Beschriftung nicht umfasst (da die Beschriftung außerhalb der Grenzen um 10 Punkte nach rechts verschoben ist), aber wir haben 10 Auffüllpunkte zwischen Text und Bild erreicht.
quelle
Für Swift 3 basierend auf der Antwort von Pegpeg :
quelle
Alles oben funktionierte nicht für iOS 9+ , was ich getan habe ist:
Um nun einen Rahmen um die Schaltfläche hinzuzufügen, verwenden Sie einfach die folgende Methode:
quelle
Ich wollte ein 5-Punkt-Leerzeichen zwischen meinem UIButton-Symbol und dem Etikett einfügen. So habe ich es erreicht:
Die Beziehung zwischen contentEdgeInsets, titleEdgeInsets und imageEdgeInsets erfordert ein kleines Geben und Nehmen von jedem Einschub. Wenn Sie also links links einige Einfügungen hinzufügen, müssen Sie rechts negative Einfügungen hinzufügen und rechts mehr Platz (über einen positiven Einfügungen) für den Inhalt bereitstellen.
Durch Hinzufügen eines richtigen Inhaltseinsatzes, der der Verschiebung der Titeleinfügungen entspricht, geht mein Text nicht über die Grenzen der Schaltfläche hinaus.
quelle
Die Option ist auch im Interface Builder verfügbar. Siehe den Einschub. Ich setze links und rechts auf 3. Funktioniert wie ein Zauber.
quelle
Die Lösung, die ich verwende, besteht darin, der Schaltfläche eine Breitenbeschränkung hinzuzufügen. Aktualisieren Sie dann irgendwo in der Initialisierung, nachdem Ihr Text festgelegt wurde, die Breitenbeschränkung wie folgt:
self.buttonWidthConstraint.constant = self.shareButton.intrinsicContentSize.width + 8;
Wo 8 ist, was auch immer Ihr Einschub ist.
quelle
constant
die Einschränkung manuell auf den neuen Wert aktualisieren ... und wissen, wann sich die Größe des intrinsischen Inhalts der Schaltfläche ändert ohne die Schaltfläche zu unterklassifizieren.setNeedsUpdateConstraints
kann "manuell" erfolgen, nachdem der Titel oder das Bild der Schaltfläche aktualisiert wurden. Von dort aus können Sie die Konstante überschreibenupdateConstraints
und neu berechnenbuttonWidthConstraint
. Dies ist nicht unbedingt der beste Ansatz, aber er funktioniert gut genug für mich. YMMV;)Durch Aufrufen von sizeToFit () wird sichergestellt, dass contentEdgeInset wirksam wird
quelle