ios - settitle - swift button action
Swift-UIButton con dos lĂneas de texto (8)
Me preguntaba si es posible crear un UIButton con dos líneas de texto. Necesito que cada línea tenga un tamaño de fuente diferente. La primera línea será de 17 puntos y la segunda será de 11 puntos. He intentado jugar con dos etiquetas dentro de un UIButton, pero no consigo que se queden dentro de los límites del botón.
Estoy tratando de hacer todo esto en el generador de interfaz de usuario, y no mediante programación.
Gracias
Estaba buscando casi el mismo tema, excepto que no necesito dos tamaños de fuente diferentes. En caso de que alguien esté buscando una solución simple:
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)
Hay dos preguntas
Me preguntaba si es posible crear un UIButton con dos líneas de texto
Esto es posible mediante el uso del guión gráfico o mediante programación.
Storyboard:
Cambie el ''Modo de salto de línea'' a Ajuste de caracteres o Ajuste de palabras y use Alt / Opción + tecla Intro para ingresar una nueva línea en el campo Título de UIButton.
Programáticamente:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
btnTwoLine?.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping;
}
Necesito que cada línea tenga un tamaño de fuente diferente 1
El peor de los casos es que puede usar una clase
UIButton
personalizada y agregar dos etiquetas dentro de ella.
La mejor manera es utilizar
NSMutableAttributedString
.
Tenga en cuenta que esto solo se puede lograr mediante programación.
Swift 5:
@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)
}
Swift mayor
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)
Salida
He notado un problema en la mayoría de las soluciones que es al hacer el modo de salto de línea a "Ajuste de caracteres" la segunda línea quedará alineada con la primera línea
Para hacer todas las líneas centradas. simplemente cambie el título De simple a Atribuido y luego puede hacer que cada línea se centre
He solucionado esto y mi solución fue solo en el Storyboard.
Cambios:
Se agregó en el Inspector de identidad -> Atributos de tiempo de ejecución definidos por el usuario (estos KeyPaths):
- numberOfLines = 2
- titleLabel.textAlignment = 1
Atributos de tiempo de ejecución definidos por el usuario
Agregué esto en el inspector de atributos:
- salto de línea = ajuste de línea
Necesita hacer algo de esto en código. no puede configurar 2 fuentes diferentes en IB. Además de cambiar el modo de salto de línea a ajuste de caracteres, necesita algo como esto para establecer el título,
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)
Una forma de hacerlo es con etiquetas, supongo. Hice esto, y parece funcionar bien. Podría crear esto como un UIButton y luego exponer las etiquetas, supongo. No sé si esto tiene sentido.
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)
cambie el salto de línea al ajuste de caracteres, seleccione su botón y en el inspector de atributos vaya al salto de línea y cámbielo a ajuste de caracteres
Sintaxis de SWIFT 3
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)
}