Ich habe ein paar UIButtons und in IB sind sie auf Aspect Fit eingestellt, aber aus irgendeinem Grund dehnen sie sich immer. Gibt es noch etwas, das Sie einstellen müssen? Ich habe all die verschiedenen Ansichtsmodi ausprobiert und keiner von ihnen funktioniert, sie dehnen sich alle.
ios
iphone
uibutton
aspect-fit
Marty
quelle
quelle
Antworten:
Ich hatte dieses Problem schon einmal. Ich habe es gelöst, indem ich mein Bild in ein Feld eingefügt habe, in
UIImageView
dem diecontentMode
Einstellungen tatsächlich funktionieren, und darüber ein transparentes benutzerdefiniertesUIButton
Element eingefügt habe.EDIT: Diese Antwort ist veraltet. Siehe @Werner Altewischer Antwort für die richtige Antwort in modernen Versionen von iOS.
quelle
Die Lösung besteht darin,
contentMode
dieimageView
Eigenschaft auf die zu setzenUIButton
. DasUIButton
muss mit einem benutzerdefinierten Typ erstellt werden, damit dies funktioniert, glaube ich (andernfallsnil
wird es für diese Eigenschaft zurückgegeben).quelle
[button.imageView setContentMode:UIViewContentModeScaleAspectFit];
button.imageView!.contentMode = UIViewContentMode.scaleAspectFit
Diese Methode hat bei mir sehr gut funktioniert.:
Wählen Sie in Xib die Schaltfläche und stellen Sie Folgendes ein
user defined runtime attributes
:self.imageView.contentMode
Number
1
quelle
extension UIButton { @IBInspectable var imageContentMode: Int { get {return imageView?.contentMode.rawValue ?? 0} set {imageView?.contentMode = UIViewContentMode(rawValue: newValue) ?? .scaleAspectFit} } }
imageView.contentMode
für mich gearbeitet!Wenn Sie dies in Interface Builder tun, können Sie den Inspektor für Laufzeitattribute verwenden, um dies direkt ohne Code festzulegen.
Stellen Sie Ihren Schlüsselpfad auf der Schaltfläche auf "imageView.contentMode" mit dem Typ "Number" und dem Wert "1" (oder einem beliebigen Modus) ein.
quelle
Verwenden Sie die imageView der Schaltfläche für den ContentMode. Nicht direkt auf der Schaltfläche selbst.
quelle
Wenn Sie das Bild
UIImageView
hinter der Schaltfläche platzieren, verlieren Sie die integrierte Funktionalität derUIButton
Klasse, wie z. B.adjustsImageWhenHighlighted
undadjustsImageWhenDisabled
, und natürlich die Möglichkeit, verschiedene Bilder für verschiedene Zustände festzulegen (ohne dies selbst zu tun).Wenn ein Bild für alle Kontrollzustände nicht gestreckt werden soll, besteht ein Ansatz darin, das Bild
imageWithCGImage:scale:orientation
wie in der folgenden Methode zu verwenden:Um dies umzusetzen, würden wir schreiben:
Dies sollte verhindern, dass sich das Bild in allen Kontrollzuständen dehnt. Es hat bei mir funktioniert, aber lassen Sie es mich wissen, wenn es nicht funktioniert!
HINWEIS: Hier sprechen wir ein Problem an
UIButton
, dasinsideButton:
sichinsideView:
auf das Bild bezieht , aber das könnte genauso gut sein oder was auch immer.quelle
Ich hatte dieses Problem vor einiger Zeit. Das Problem, das ich hatte, war, dass ich versucht habe, diesen Effekt auf den Hintergrund-UIButton anzuwenden, der begrenzt ist und daher bedeutet, dass Sie ihn nicht so einfach anpassen können.
Der Trick besteht darin, es nur als Bild festzulegen und dann die Technik von @ ayreguitar anzuwenden, und das sollte es beheben!
quelle
Das hat bei mir funktioniert
Vielen Dank an @ayreguitar für seinen Kommentar
quelle
Hier ist eine alternative Antwort in Kürze:
quelle
Kombinieren Sie einige unterschiedliche Antworten zu einer Lösung: Erstellen Sie eine Schaltfläche mit einem benutzerdefinierten Typ, legen Sie die imageView contentMode-Eigenschaft der Schaltfläche fest und legen Sie das Bild für die Schaltfläche fest (nicht das Hintergrundbild, das weiterhin zum Füllen skaliert wird).
quelle
quelle
Diese Antwort basiert auf der Antwort von @ WernerAltewischer .
Um zu vermeiden, dass meine Schaltfläche mit einem IBOutlet verbunden wird, um den Code darauf auszuführen, habe ich die Klasse von UIButton in Unterklassen unterteilt:
Erstellen Sie nun eine benutzerdefinierte Schaltfläche in Ihrer xib und legen Sie deren Bild fest (nicht das Hintergrundbild):
Stellen Sie dann die Klasse ein:
Du bist fertig!
Anstelle des
Bildaspekts Ihrer Schaltfläche ist jetzt die Anpassung wie erwartet:
quelle
ios 12. Sie müssen auch die Inhaltsausrichtung hinzufügen
quelle
Ich hatte Probleme damit, dass die Größe des Bilds nicht proportional geändert wurde, sodass bei der Art und Weise, wie ich es reparierte, Kanteneinsätze verwendet wurden.
quelle
Die UIView-Inhaltsmodi gelten für den "Inhalt" des entsprechenden CALayer. Dies funktioniert für
UIImageView
s, da sie denCALayer
Inhalt auf den entsprechenden Wert setzenCGImage
.drawRect:
letztendlich wird auf den Ebeneninhalt gerendert.Ein Benutzerdefinierter
UIButton
(soweit ich weiß) hat keinen Inhalt (die Schaltflächen im abgerundeten Rechteckstil werden möglicherweise mit Inhalt gerendert). Die Schaltfläche verfügt über Unteransichten: den HintergrundUIImageView
, das BildUIImageView
und den TitelUILabel
. Das Festlegen dercontentMode
Unteransichten kann das tun, was Sie wollen, aber das Herumspielen mit derUIButton
Ansichtshierarchie ist ein bisschen ein Nein-Nein.quelle
Ändern
UIButton.imageView.contentMode
hat bei mir nicht funktioniert.Ich habe das Problem gelöst, indem ich das Bild auf die Eigenschaft 'Hintergrund' gesetzt habe.
Sie können bei Bedarf eine Verhältnisbeschränkung hinzufügen
quelle
Dies überschneidet sich mit vielen anderen Antworten, aber die Lösung für mich war zu
contentMode
desUIImageView
für die Schaltfläche.ScaleAspectFit
- , die entweder in den im Interface Builder „User Runtime - Attribut definiert“ durchgeführt werden (dh.self.imageView.contentMode
, Zahl, 1) oder in einerUIButton
Unterklasse;quelle
Sie können imageWithCGImage wie oben gezeigt verwenden (jedoch ohne die fehlenden Klammern).
Außerdem ... funktionieren Millionen von Nicht-4.0-Telefonen überhaupt nicht mit diesem Code.
quelle
[button sizeToFit]
arbeitete für mich.quelle
Ähnlich wie bei @Guillaume habe ich eine Unterklasse von UIButton als Swift-Datei erstellt. Dann legen Sie meine benutzerdefinierte Klasse im Interface Builder fest:
.
Und hier die Swift-Datei:
quelle
Ich hatte das gleiche Problem, aber ich konnte es nicht zum Laufen bringen (vielleicht ist es ein Fehler mit dem SDK).
Als Problemumgehung platzierte ich schließlich ein
UIImageView
hinter meinem Button und stellte die gewünschten Optionen ein. Dann platzierte ich einfach ein LeerzeichenUIButton
darüber.quelle