Estoy tratando de crear un botón que tenga algo de texto debajo del icono (algo así como los botones de la aplicación), sin embargo, parece ser bastante difícil de lograr. ¿Alguna idea de cómo puedo conseguir que el texto se muestre debajo de la imagen con un UIButton
?
158
https://github.com/albert-zhang/AZCenterLabelButton
( Enlace )Respuestas:
O simplemente puede usar esta categoría:
ObjC
Extensión rápida
Sugerencia: Si la altura del botón es menor que
totalHeight
, entonces la imagen dibujará bordes exteriores.imageEdgeInset.top
debiera ser:fuente
CGRectGetHeight()
yCGRectGetWidth()
al obtener la altura y el ancho de imageView y titleLabel.CGFloat inset = (self.frame.size.height - totalHeight)/2; self.contentEdgeInsets = UIEdgeInsetsMake(inset, 0.0f, inset, 0.0f);
En Xcode, simplemente puede establecer el recuadro izquierdo del título del borde en negativo al ancho de la imagen. Esto mostrará la etiqueta en el centro de la imagen.
Para que la etiqueta se muestre debajo de la imagen (algo así como los botones de la aplicación), es posible que deba configurar el recuadro superior del título del borde en algún número positivo.
fuente
Este es un botón de título centrado simple implementado en Swift anulando
titleRect(forContentRect:)
yimageRect(forContentRect:)
. También se implementaintrinsicContentSize
para usar con AutoLayout.fuente
Mira esta gran respuesta en Swift.
fuente
left
enimageEdgeInsets
la(self.frame.size.width - imageSize.width) / 2
layoutSubviews()
su supervista.Subclase
UIButton
. Anular:layoutSubviews
para mover el incorporadosubviews
a nuevas posiciones:fuente
titleRectForContentRect
yimageRectForContentRect
Respuesta de icecrystal23 refactorizada.
Swift 3, funciona con autolayouts, xib, storyboards, puede ser animado.
El botón en la respuesta original de icecrystal23 tenía un marco mal calculado. Creo que lo arreglé.
Editar: actualizado a Swift 5 e hizo el trabajo dentro de Interface Builder / Storyboards
fuente
corrigió una de las respuestas aquí:
Swift 3:
fuente
Esta es una versión modificada de la excelente respuesta de Erik W. Pero en lugar de colocar la imagen centrada en la parte SUPERIOR de la vista, coloca la imagen y la etiqueta centradas en la vista como un grupo.
La diferencia es:
vs
Fuente a continuación:
FYI: Esto puede romperse cuando se combina con animaciones UIView, ya que se llama a layoutSubviews durante ellas.
fuente
La solución de Dave en Swift:
fuente
Si subclasifica
UIButton
yoverride layoutSubviews
, puede usar el siguiente para centrar la imagen y colocar el título centrado debajo:kTextTopPadding
es una constante que deberás introducir que determina el espacio entre la imagen y el texto debajo de ella.fuente
Se actualizó la respuesta de Kenny Winker ya que sizeWithFont fue desaprobado en iOS 7.
fuente
En iOS 11 / Swift 4, ninguna de las respuestas anteriores realmente funcionó para mí. Encontré algunos ejemplos y le di la vuelta:
Espero que esto ayude a alguien.
fuente
Usando el código de Kenny Winker y simeon, hago este código rápido que funciona para mí.
fuente
Solo tiene que ajustar las tres inserciones de borde según el tamaño de la imagen y la etiqueta del título:
Puede obtener los límites de la etiqueta del título llamando a sizeToFit después de configurar su texto. El espaciado horizontal debería funcionar independientemente del tamaño del texto, la fuente y la imagen, pero no conozco una solución única para que el espaciado vertical y el borde del contenido inferior sean consistentes.
fuente
Aquí está la respuesta de "Bear With Me" como una subclase en
Swift 2.0
. Para usarlo, simplemente cambie la clase de su botónInterface Builder
aVerticalButton
y actualizará mágicamente la vista previa.También lo actualicé para calcular el tamaño de contenido intrínseco correcto para la distribución automática.
fuente
layoutSubviews()
se llama repetidamente en mi caso:intrinsicContentSize
accesosimageView
que hace quelayoutSubviews
se llamó el cual accesosimageView
etc@Tiago cambio tu respuesta así. Funciona bien con todos los tamaños.
fuente
Tomé una combinación de las respuestas aquí y se me ocurrió una que parece estar funcionando para mí, en Swift. No me encanta cómo acabo de anular las inserciones, pero funciona. Estaría abierto a las mejoras sugeridas en los comentarios. Parece funcionar correctamente con
sizeToFit()
y con diseño automático.fuente
Use estos dos métodos:
Ejemplo:
Y puedes usar:
fuente
Swift 5 : el siguiente método me funciona
Asegúrese de que el título de su botón no esté truncado en storyboard / xib; de lo contrario, busque la
Solución 2
fuente
Creo que una de las mejores formas de hacerlo es subclasificar UIButton y anular algunos métodos de representación:
fuente
Descubrí que la respuesta de Simeón era probablemente la mejor, pero me estaba dando resultados extraños en algunos botones y simplemente no podía entender por qué. Entonces, usando su respuesta como base, implementé mis botones como a continuación:
fuente
Aquí está mi subclase de la
UIButton
cual resuelve este problema:Eso es. Funciona como encanto. El problema puede aparecer si el botón será demasiado pequeño para ajustarse al título y al texto.
fuente
La solución de @ simeon en Objective-C
fuente
CGSizeMake(MAX(labelSize.width, image.size.width), image.size.height + labelSize.height + 5.0)
en el caso de siSi está utilizando fuentes personalizadas, el cálculo del tamaño titleLabel no funcionará correctamente, debe reemplazarlo por
let titleLabelSize = self.titleLabel?.text?.size(withAttributes: [NSAttributedStringKey.font: self.titleLabel!.font!])
fuente
En lugar de pasar por el infierno tratando de colocar el icono y el texto con inserciones de borde, puede crear una cadena NSAttributedString con su imagen como archivo adjunto y establecerla en el título atribuido de su botón:
fuente
UIButton
diseños de campo de texto 's para mostrar solamente 1 línea, por lo que no funciona incluso cuando se utiliza un salto de línea en la cadena con atributos. Sería una buena solución de lo contrario.button.titleLabel?.numberOfLines
para obtener el número necesario de líneasSolución amigable de localización:
Muchas soluciones geniales, pero me gustaría agregar una nota aquí para aquellos que usan la localización.
Debe invertir los valores de EdgeInstets izquierdo y derecho para que el botón se distribuya correctamente en caso de que cambie la dirección del idioma de LtR a RtL.
Usando una solución similar, la implementaría de la siguiente manera:
fuente
Imagen superior y botón de título inferior con subclase UIButton
fuente
Eso definitivamente es una exageración para esta pregunta, sin embargo ... En uno de mis proyectos, primero tuve que implementar un botón con el icono alineado más a la izquierda. Luego tenemos otro botón con título debajo de la imagen. Busqué una solución existente pero sin suerte. Entonces, aquí va el botón alineable:
Esperamos que te sea útil.
fuente
Algo así dentro de la
UIButton
subclasefuente
Es muy simple.
En lugar de esto:
Utilizar este:
Luego puede agregar texto en el botón fácilmente usando:
// button.titleLabel! .font = UIFont (nombre: "FontName", tamaño: 30)
fuente