Ich habe mich gefragt, ob es möglich ist, einen UIButton mit zwei Textzeilen zu erstellen. Ich brauche jede Zeile, um eine andere Schriftgröße zu haben. Die erste Linie wird 17 Punkte und die zweite 11 Punkte sein. Ich habe versucht, zwei Beschriftungen in einen UIButton einzufügen, aber ich kann sie nicht dazu bringen, innerhalb der Grenzen der Schaltfläche zu bleiben.
Ich versuche dies alles im UI-Builder zu tun und nicht programmgesteuert.
Ich habe mich gefragt, ob es möglich ist, einen UIButton mit zwei Textzeilen zu erstellen
Dies ist über das Storyboard oder programmgesteuert möglich.
Storyboard:
Ändern Sie den ‚Zeilenumbruch - Modus‘ zu Zeichen Wickeln oder Zeilenumbruch und verwenden Alt / Option + Enter - Taste eine neue Zeile in der UIButton des Titelfeld einzugeben.
Ich brauche jede Zeile, um eine andere Schriftgröße 1 zu haben
Im schlimmsten Fall können Sie eine benutzerdefinierte UIButtonKlasse verwenden und zwei Beschriftungen hinzufügen.
Der bessere Weg ist, nutzen NSMutableAttributedString. Beachten Sie, dass dies nur programmgesteuert erreicht werden kann.
Swift 5:
@IBOutletweakvar btnTwoLine:UIButton?overridefunc viewDidAppear(animated:Bool){super.viewDidAppear(animated)//applying the line break mode
textResponseButton?.titleLabel?.lineBreakMode =NSLineBreakMode.byWordWrapping;let buttonText:NSString="hello\nthere"//getting the range to separate the button title strings
let newlineRange:NSRange= buttonText.range(of:"\n")//getting both substrings
var substring1=""var substring2=""if(newlineRange.location !=NSNotFound){
substring1= buttonText.substring(to: newlineRange.location)
substring2= buttonText.substring(from: newlineRange.location)}//assigning diffrent fonts to both substrings
let font1:UIFont=UIFont(name:"Arial", size:17.0)!let attributes1=[NSMutableAttributedString.Key.font: font1]let attrString1=NSMutableAttributedString(string: substring1, attributes: attributes1)let font2:UIFont=UIFont(name:"Arial", size:11.0)!let attributes2=[NSMutableAttributedString.Key.font: font2]let attrString2=NSMutableAttributedString(string: substring2, attributes: attributes2)//appending both attributed strings
attrString1.append(attrString2)//assigning the resultant attributed strings to the button
textResponseButton?.setAttributedTitle(attrString1,for:[])}
Älterer Swift
@IBOutletweakvar btnTwoLine:UIButton?overridefunc viewDidAppear(animated:Bool){super.viewDidAppear(animated)//applying the line break mode
btnTwoLine?.titleLabel?.lineBreakMode =NSLineBreakMode.ByWordWrapping;var buttonText:NSString="hello\nthere"//getting the range to separate the button title strings
var newlineRange:NSRange= buttonText.rangeOfString("\n")//getting both substrings
var substring1:NSString=""var substring2:NSString=""if(newlineRange.location !=NSNotFound){
substring1= buttonText.substringToIndex(newlineRange.location)
substring2= buttonText.substringFromIndex(newlineRange.location)}//assigning diffrent fonts to both substrings
let font:UIFont?=UIFont(name:"Arial", size:17.0)let attrString =NSMutableAttributedString(
string: substring1asString,
attributes:NSDictionary(
object: font!,
forKey:NSFontAttributeName)as[NSObject:AnyObject])let font1:UIFont?=UIFont(name:"Arial", size:11.0)let attrString1=NSMutableAttributedString(
string: substring2asString,
attributes:NSDictionary(
object: font1!,
forKey:NSFontAttributeName)as[NSObject:AnyObject])//appending both attributed strings
attrString.appendAttributedString(attrString1)//assigning the resultant attributed strings to the button
btnTwoLine?.setAttributedTitle(attrString, forState:UIControlState.Normal)}
Funktioniert super. Ich frage mich jetzt, ob es eine Möglichkeit gibt, den Text in jeder Zeile zu zentrieren, und ob es eine Möglichkeit gibt, mehr Platz zwischen den beiden Zeilen einzufügen.
Scott
3
Sie können beide Zeilentexte an der Mitte ausrichten. Schreiben Sie den folgenden Code: btnTwoLine? .titleLabel? .textAlignment = NSTextAlignment.Center oder verwenden Sie die Storyboard-Datei (Steuerabschnitt-> Ausrichtung)
Shamsudheen TK
Darf ich wissen, was der Zweck ist, mehr Zeilen dazwischen zu setzen?
Shamsudheen TK
Dies hängt von der Größe der Schaltfläche ab. Wenn die Schaltfläche groß ist, befinden sich die beiden Textzeilen genau in der Mitte, mit viel Platz oben und unten. Das ist nicht der Look, den ich wollte.
Scott
Sie müssen hier einige Tricks anwenden :) Sie können mehr Zeilen dazwischen setzen, indem Sie mehrere \ n verwenden. Ich meine, "Hallo \ n \ n \ nthere" gibt Ihnen drei Leerzeichen. Vergessen Sie jedoch nicht, Ihren Code zu ändern var newlineRange: NSRange = buttonText.rangeOfString ("\ n \ n \ n")
Shamsudheen TK
22
Ich habe nach fast demselben Thema gesucht, außer dass ich keine zwei verschiedenen Schriftgrößen benötige. Für den Fall, dass jemand nach einer einfachen Lösung sucht:
Ich habe bei den meisten Lösungen ein Problem festgestellt, bei dem beim Umschalten des Zeilenumbruchmodus auf "Zeichenumbruch" die zweite Zeile an der ersten Zeile ausgerichtet bleibt
Alle Linien zentrieren. Ändern Sie einfach den Titel von "Einfach" in "Attributiert" und Sie können jede Linie zentrieren
Ändern Sie den Zeilenumbruch in Zeichenumbruch, wählen Sie Ihre Schaltfläche aus und wechseln Sie im Attributinspektor zum Zeilenumbruch und ändern Sie ihn in Zeichenumbruch
Sie müssen einige davon im Code ausführen. Sie können in IB nicht zwei verschiedene Schriftarten festlegen. Zusätzlich zum Ändern des Zeilenumbruchmodus in Zeichenumbruch benötigen Sie Folgendes, um den Titel festzulegen.
Eine Möglichkeit, dies zu tun, sind wohl Etiketten. Ich habe das getan und es scheint in Ordnung zu funktionieren. Ich könnte dies als UIButton erstellen und dann die Beschriftungen verfügbar machen, denke ich. Ich weiß nicht, ob das Sinn macht.
Die vorgeschlagenen Lösungen haben für mich leider nicht funktioniert, als ich eine mehrzeilige Schaltfläche in einer CollectionView haben wollte. Dann zeigte mir ein Kollege eine Problemumgehung, die ich teilen wollte, falls jemand das gleiche Problem hat - hoffe, das hilft! Erstellen Sie eine Klasse, die von UIControl erbt, und erweitern Sie sie um eine Bezeichnung, die sich dann ähnlich wie eine Schaltfläche verhält.
Ich habe nach fast demselben Thema gesucht, außer dass ich keine zwei verschiedenen Schriftgrößen benötige. Für den Fall, dass jemand nach einer einfachen Lösung sucht:
quelle
Ich habe bei den meisten Lösungen ein Problem festgestellt, bei dem beim Umschalten des Zeilenumbruchmodus auf "Zeichenumbruch" die zweite Zeile an der ersten Zeile ausgerichtet bleibt
Alle Linien zentrieren. Ändern Sie einfach den Titel von "Einfach" in "Attributiert" und Sie können jede Linie zentrieren
quelle
SWIFT 3-Syntax
quelle
Ändern Sie den Zeilenumbruch in Zeichenumbruch, wählen Sie Ihre Schaltfläche aus und wechseln Sie im Attributinspektor zum Zeilenumbruch und ändern Sie ihn in Zeichenumbruch
quelle
Ich habe dies behoben und meine Lösung war nur im Storyboard.
Änderungen:
Es wurde im Identitätsinspektor -> Benutzerdefinierte Laufzeitattribute (diese Schlüsselpfade) hinzugefügt:
Benutzerdefinierte Laufzeitattribute
Ich habe dies im Attributinspektor hinzugefügt:
Zeilenumbruch
quelle
Sie müssen einige davon im Code ausführen. Sie können in IB nicht zwei verschiedene Schriftarten festlegen. Zusätzlich zum Ändern des Zeilenumbruchmodus in Zeichenumbruch benötigen Sie Folgendes, um den Titel festzulegen.
quelle
Eine Möglichkeit, dies zu tun, sind wohl Etiketten. Ich habe das getan und es scheint in Ordnung zu funktionieren. Ich könnte dies als UIButton erstellen und dann die Beschriftungen verfügbar machen, denke ich. Ich weiß nicht, ob das Sinn macht.
quelle
meine Art:
quelle
Die vorgeschlagenen Lösungen haben für mich leider nicht funktioniert, als ich eine mehrzeilige Schaltfläche in einer CollectionView haben wollte. Dann zeigte mir ein Kollege eine Problemumgehung, die ich teilen wollte, falls jemand das gleiche Problem hat - hoffe, das hilft! Erstellen Sie eine Klasse, die von UIControl erbt, und erweitern Sie sie um eine Bezeichnung, die sich dann ähnlich wie eine Schaltfläche verhält.
quelle