Je me demandais s'il était possible de créer un UIButton avec deux lignes de texte. J'ai besoin que chaque ligne ait une taille de police différente. La première ligne sera de 17 points et la seconde sera de 11 points. J'ai essayé de jouer avec mettre deux étiquettes à l'intérieur d'un UIButton, mais je ne peux pas les amener à rester dans les limites du bouton.
J'essaie de faire tout cela dans le constructeur ui, et non par programmation.
Merci
Il y a deux questions.
Je me demandais s'il était possible de créer un UIButton avec deux lignes de texte
Ceci est possible en utilisant le storyboard ou par programmation.
Storyboard:
Changez le 'mode de saut de ligne' en saut de caractère ou retour à la ligne et utilisez la touche Alt/Option + Entrée pour saisir une nouvelle ligne dans les UIButton Champ de titre.
par programme:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
btnTwoLine?.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping;
}
J'ai besoin que chaque ligne ait une taille de police différente 1
Le pire des cas est que vous pouvez utiliser une classe personnalisée UIButton
et y ajouter deux étiquettes.
Le meilleur moyen est d'utiliser NSMutableAttributedString
. Notez que cela ne peut être réalisé que par programme.
@IBOutlet weak var btnTwoLine: UIButton?
override func 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: substring1 as String,
attributes: NSDictionary(
object: font!,
forKey: NSFontAttributeName) as [NSObject : AnyObject])
let font1:UIFont? = UIFont(name: "Arial", size: 11.0)
let attrString1 = NSMutableAttributedString(
string: substring2 as String,
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)
}
sortie
Je cherchais presque le même sujet, sauf que je n'avais pas besoin de deux tailles de police différentes. Si quelqu'un recherche une solution simple:
let button = UIButton()
button.titleLabel?.numberOfLines = 0
button.titleLabel?.lineBreakMode = .byWordWrapping
button.setTitle("Foo\nBar", for: .normal)
button.titleLabel?.textAlignment = .center
button.sizeToFit()
button.addTarget(self, action: #selector(rightBarButtonTapped), for: .allEvents)
navigationItem.rightBarButtonItem = UIBarButtonItem(customView: button)
Syntaxe Swift
let str = NSMutableAttributedString(string: "First line\nSecond Line")
str.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: 17), range: NSMakeRange(0, 10))
str.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: 12), range: NSMakeRange(11, 11))
button.setAttributedTitle(str, for: .normal)
changez le saut de ligne en saut de caractère, sélectionnez votre bouton et dans l'inspecteur d'attributs allez dans le saut de ligne et changez-le en saut de caractère
J'ai corrigé ceci et ma solution était uniquement dans le Storyboard.
Modifications:
Il a ajouté dans Inspecteur d'identité -> Attributs d'exécution définis par l'utilisateur (ces KeyPaths):
Attributs d'exécution définis par l'utilisateur
J'ai ajouté ceci dans l'inspecteur d'attributs:
Une façon de faire est d'utiliser des étiquettes, je suppose. J'ai fait ça et ça a l'air de bien marcher. Je pourrais le créer comme un UIButton et ensuite exposer les étiquettes, je suppose. Je ne sais pas si cela a du sens.
let firstLabel = UILabel()
firstLabel.backgroundColor = UIColor.lightGrayColor()
firstLabel.text = "Hi"
firstLabel.textColor = UIColor.blueColor()
firstLabel.textAlignment = NSTextAlignment.Center
firstLabel.frame = CGRectMake(0, testButton.frame.height * 0.25, testButton.frame.width, testButton.frame.height * 0.2)
testButton.addSubview(firstLabel)
let secondLabel = UILabel()
secondLabel.backgroundColor = UIColor.lightGrayColor()
secondLabel.textColor = UIColor.blueColor()
secondLabel.font = UIFont(name: "Arial", size: 12)
secondLabel.text = "There"
secondLabel.textAlignment = NSTextAlignment.Center
secondLabel.frame = CGRectMake(0, testButton.frame.height * 0.5, testButton.frame.width, testButton.frame.height * 0.2)
testButton.addSubview(secondLabel)
Vous devez en faire une partie dans le code. vous ne pouvez pas définir 2 polices différentes dans IB. En plus de changer le mode de saut de ligne en retour à la ligne, vous avez besoin de quelque chose comme ceci pour définir le titre,
override func viewDidLoad() {
super.viewDidLoad()
var str = NSMutableAttributedString(string: "First line\nSecond Line")
str.addAttribute(NSFontAttributeName, value: UIFont.systemFontOfSize(17), range: NSMakeRange(0, 10))
str.addAttribute(NSFontAttributeName, value: UIFont.systemFontOfSize(12), range: NSMakeRange(11, 11))
button.setAttributedTitle(str, forState: .Normal)
}