Tengo el siguiente código...
UILabel *buttonLabel = [[UILabel alloc] initWithFrame:targetButton.bounds];
buttonLabel.text = @"Long text string";
[targetButton addSubview:buttonLabel];
[targetButton bringSubviewToFront:buttonLabel];
... la idea es que puedo tener texto de varias líneas para el botón, pero el texto siempre está oscurecido por la imagen de fondo del botón UIB. Una llamada de registro para mostrar las subvistas del botón muestra que se ha agregado el UILabel, pero el texto en sí no se puede ver. ¿Es esto un error en UIButton o estoy haciendo algo mal?
ios
cocoa-touch
uibutton
uikit
Owain Hunt
fuente
fuente
button.titleLabel?.numberOfLines = 0
Respuestas:
Para iOS 6 y superior, use lo siguiente para permitir varias líneas:
Para iOS 5 y versiones inferiores, use lo siguiente para permitir varias líneas:
2017, para iOS9 en adelante ,
en general, solo haz estas dos cosas:
fuente
button.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping
NSLineBreakMode
, así:button.titleLabel?.lineBreakMode = .ByWordWrapping
.La respuesta seleccionada es correcta, pero si prefiere hacer este tipo de cosas en Interface Builder, puede hacerlo:
fuente
titleLabel.textAlignment
con elNumber
valor1
inUser Defined Runtime Attributed
para centrar el textoSi desea agregar un botón con el título centrado con varias líneas, establezca la configuración de Interface Builder para el botón:
[ ]
fuente
Para iOS 6:
Como
están en desuso en iOS 6 en adelante.
fuente
NSText.h
el interiorFoundation
no hay agregado en desuso. Está disponible desde 6.0 pero no en desuso.button.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping
button.titleLabel?.textAlignment = NSTextAlignment.Center
Para repetir la sugerencia de Roger Nolan, pero con código explícito, esta es la solución general:
fuente
SWIFT 3
fuente
En Xcode 9.3 puedes hacerlo usando el guión gráfico como se muestra a continuación,
Debe configurar el texto del título del botón Alineación al centro
button.titleLabel?.textAlignment = .center
No es necesario establecer el texto del título con una nueva línea (\ n) como a continuación,
button.setTitle("Good\nAnswer",for: .normal)
Simplemente establezca el título,
button.setTitle("Good Answer",for: .normal)
Aquí está el resultado,
fuente
myButton.titleLabel.textAlignment = NSTextAlignmentCenter
declaración también es necesaria.Hay una manera mucho más fácil:
(Editar para iOS 3 y posterior :)
fuente
Alinear a la izquierda en iOS7 con autolayout:
fuente
Tuve un problema con el diseño automático, después de habilitar varias líneas, el resultado fue el siguiente: por lo que el tamaño no afecta el tamaño del botón que he agregado en función de (en este caso, contentEdgeInsets fue (10, 10, 10, 10 ) después de llamar : espero que te ayude (swift 5.0):
titleLabel
Constraints
contentEdgeInsets
makeMultiLineSupport()
fuente
En primer lugar, debe tener en cuenta que UIButton ya tiene un UILabel dentro. Puedes configurarlo usando
–setTitle:forState:
.El problema con su ejemplo es que necesita establecer la
numberOfLines
propiedad de UILabel en algo diferente a su valor predeterminado de 1. También debe revisar lalineBreakMode
propiedad.fuente
Para aquellos que usan el guión gráfico de Xcode 4, puede hacer clic en el botón, y en el panel derecho de Utilidades, debajo del Inspector de atributos, verá una opción para Salto de línea. Elija Word Wrap, y debería estar listo para comenzar.
fuente
Las respuestas aquí le dicen cómo lograr el título del botón multilínea mediante programación.
Solo quería agregar que si está usando guiones gráficos, puede escribir [Ctrl + Enter] para forzar una nueva línea en el campo de título de un botón.
HTH
fuente
Tienes que agregar este código:
fuente
En cuanto a la idea de Brent de poner el título UILabel como vista de hermano, no me parece una muy buena idea. Sigo pensando en problemas de interacción con el UILabel debido a que sus eventos táctiles no llegan a la vista del UIButton.
Por otro lado, con un UILabel como subvista del UIButton, me siento bastante cómodo sabiendo que los eventos táctiles siempre se propagarán a la supervista del UILabel.
Tomé este enfoque y no noté ninguno de los problemas reportados con backgroundImage. Agregué este código en -titleRectForContentRect: de una subclase UIButton, pero el código también se puede colocar en la rutina de dibujo de la supervista UIButton, que en ese caso reemplazará todas las referencias a sí mismo con la variable UIButton.
Me tomé el tiempo y escribí un poco más sobre esto aquí . Allí, también apunto una solución más corta, aunque no se ajusta a todos los escenarios e involucra el pirateo de algunas vistas privadas. También allí, puede descargar una subclase de UIButton lista para ser utilizada.
fuente
Si usa el diseño automático en iOS 6, es posible que también deba configurar la
preferredMaxLayoutWidth
propiedad:fuente
Establecer lineBreakMode en NSLineBreakByWordWrapping (ya sea en IB o código) hace que la etiqueta del botón sea multilínea, pero no afecta el marco del botón.
Si el botón tiene un título dinámico, hay un truco: coloque UILabel oculto con la misma fuente y ate su altura a la altura del botón con diseño; cuando establece el texto en el botón y la etiqueta y la distribución automática hará todo el trabajo.
Nota
La altura del tamaño intrínseco del botón de una línea es más grande que la de la etiqueta, por lo que para evitar que la altura de la etiqueta se reduzca, la prioridad de contenido vertical debe ser mayor que la resistencia de compresión de contenido vertical del botón.
fuente
En Swift 5.0 y Xcode 10.2
En su llamada de ViewController así
fuente
Swift 5, para texto de varias líneas en UIButton
fuente
Funciona perfectamente
Agregue para usar esto con un archivo de configuración como Plist, debe usar CDATA para escribir el título multilínea, así:
fuente
Si usa el diseño automático.
fuente
swift 4.0
fuente
En estos días, si realmente necesita que este tipo de cosas sean accesibles en el generador de interfaces caso por caso, puede hacerlo con una extensión simple como esta:
Luego, simplemente puede establecer numberOfLines como un atributo en cualquier subclase UIButton o UIButton como si fuera una etiqueta. Lo mismo ocurre con una gran cantidad de otros valores generalmente inaccesibles, como el radio de la esquina de la capa de una vista o los atributos de la sombra que proyecta.
fuente
Tira tu propio botón de clase. Es, con mucho, la mejor solución a largo plazo. UIButton y otras clases de UIKit son muy restrictivas en cómo puede personalizarlas.
fuente
fuente
Incorporé la respuesta de jessecurry en STAButton, que es parte de mi biblioteca de código abierto STAControls . Actualmente lo uso dentro de una de las aplicaciones que estoy desarrollando y funciona para mis necesidades. Siéntase libre de abrir problemas sobre cómo mejorarlo o enviarme solicitudes de extracción.
fuente
Para corregir el espacio de la etiqueta del título en el botón, establezca titleEdgeInsets y otras propiedades antes de setTitle:
PD: probé establecer titleLabel? .TextAlignment no es necesario y el título se alinea
.natural
.fuente
Aunque está bien agregar una subvista a un control, no hay garantía de que realmente funcione, porque el control podría no esperar que esté allí y, por lo tanto, podría comportarse mal. Si puede salirse con la suya, simplemente agregue la etiqueta como una vista similar del botón y configure su marco para que se superponga al botón; siempre que esté configurado para aparecer en la parte superior del botón, nada de lo que pueda hacer el botón lo ocultará.
En otras palabras:
fuente
addSubview:
aquí lo agrega abutton
la supervista, lo que lo convierte en un hermano del botón, por lo que hacer coincidir sus centros es correcto.