Tengo un lugar UILabel
donde quiero agregar espacio en la parte superior e inferior. Con una altura mínima en restricción, lo he modificado a:
EDITAR: Para hacer esto he usado:
override func drawTextInRect(rect: CGRect) {
var insets: UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 10.0, bottom: 0.0, right: 10.0)
super.drawTextInRect(UIEdgeInsetsInsetRect(rect, insets))
}
Pero tengo que encontrar un método diferente porque si escribo más de dos líneas el problema es el mismo:
Respuestas:
Si quieres seguir con UILabel, sin subclasificarlo, Mundi te ha dado una solución clara.
Si, alternativamente, estaría dispuesto a evitar envolver el UILabel con una UIView, podría usar UITextView para habilitar el uso de UIEdgeInsets (relleno) o la subclase UILabel para admitir UIEdgeInsets.
Usar un UITextView solo necesitaría proporcionar las inserciones (OBJ-C):
Alternativa, si subclasifica UILabel , un ejemplo de este enfoque sería anular el método drawTextInRect
(OBJ-C)
Además, puede proporcionar a su nuevo UILabel subclasificado con variables de inserción para ARRIBA, IZQUIERDA, ABAJO y DERECHA.
Un código de ejemplo podría ser:
En .h (OBJ-C)
En .m (OBJ-C)
EDITAR # 1:
Por lo que he visto, parece que tienes que anular el tamaño de contenido intrínseco del UILabel al subclasificarlo.
Por lo tanto, debe anular intrinsicContentSize como:
Y agregue el siguiente método para editar sus inserciones, en lugar de editarlas individualmente:
Actualizará el tamaño de su UILabel para que coincida con las inserciones de los bordes y cubra la necesidad multilínea a la que se refirió.
Editar # 2
Después de buscar un poco, he encontrado este Gist con un IPInsetLabel. Si ninguna de esas soluciones funciona, puede probarla.
Editar # 3
Hubo una pregunta similar (duplicada) sobre este asunto.
Para obtener una lista completa de las soluciones disponibles, consulte esta respuesta: margen de texto de UILabel
fuente
Lo he intentado con Swift 4.2 , ¡espero que funcione para ti!
O puede usar CocoaPods aquí https://github.com/levantAJ/PaddingLabel
pod 'PaddingLabel', '1.2'
fuente
min
Swift 3
fuente
Puede hacerlo correctamente desde IB:
fuente
SWIFT 4
Solución fácil de usar, disponible para todos los niños UILabel en el proyecto.
Ejemplo:
Extensión UILabel
fuente
Simplemente use a
UIView
como supervista y defina un margen fijo para la etiqueta con diseño automático.fuente
drawTextInRect
funciona solo para 1 línea,intrinsicContentSize
no funciona con relleno horizontal. Envolver UILabel dentro de UIView es el buen camino a seguirSimplemente use un UIButton, ya está incorporado. Desactive todas las funciones de botón adicionales y tendrá una etiqueta en la que puede colocar los bordes de los bordes.
fuente
isUserInteractionEnabled = false
es útil para deshabilitarla.Sin Storyboard:
Uso:
Resultado:
fuente
Relleno de un
UILabel
solución completa. Actualizado para 2020.Resulta que hay tres cosas que deben hacerse.
1. Debe llamar a textRect # forBounds con el nuevo tamaño más pequeño
2. Debe anular drawText con el nuevo tamaño más pequeño
3. Si una celda de tamaño dinámico, debe ajustar intrinsicContentSize
En el ejemplo típico a continuación, la unidad de texto está en una vista de tabla, vista de pila o construcción similar, lo que le da un ancho fijo . En el ejemplo queremos un relleno de 60,20,20,24.
Por lo tanto, tomamos el tamaño de contenido intrínseco "existente" y en realidad agregamos 80 a la altura .
Repetir ...
Este proceso me parece confuso, pero así es como funciona. Para mí, Apple debería exponer una llamada llamada algo así como "cálculo preliminar de altura".
En segundo lugar, tenemos que usar la llamada textRect # forBounds con nuestro nuevo tamaño más pequeño .
Entonces, en textRect # forBounds primero hacemos el tamaño más pequeño y luego llamamos super.
¡Alerta! ¡ Debes llamar a Super después , no antes!
Si investiga cuidadosamente todos los intentos y discusiones en esta página, ese es el problema exacto. Observe que algunas soluciones "parecen funcionar casi", pero alguien informará que en ciertas situaciones no funcionará. Esta es de hecho la razón exacta: confusamente debes "llamar a super después", no antes.
Por lo tanto, si llama a super "en el orden incorrecto", generalmente funciona, pero no para ciertas longitudes de texto específicas .
Aquí hay un ejemplo visual exacto de "hacer super incorrectamente primero":
Observe que los márgenes 60,20,20,24 son correctos PERO el cálculo del tamaño es realmente incorrecto, ya que se realizó con el patrón "súper primero" en textRect # forBounds.
Fijo:
Observe que solo ahora el motor textRect # forBounds sabe cómo hacer el cálculo correctamente :
¡Finalmente!
Nuevamente, en este ejemplo, UILabel se está utilizando en la situación típica en la que el ancho es fijo. Entonces, en intrinsicContentSize tenemos que "agregar" la altura extra general que queremos. (No necesita "agregar" de ninguna manera al ancho, eso no tendría sentido ya que está arreglado).
Luego, en textRect # forBounds obtienes los límites "sugeridos hasta ahora" por autolayout, restas tus márgenes, y solo entonces vuelves a llamar al motor textRect # forBounds, es decir en super, que te dará un resultado.
Finalmente y simplemente en drawText, por supuesto, dibuja en el mismo cuadro más pequeño.
¡Uf!
Una vez más. Tenga en cuenta que las respuestas sobre este y otros controles de calidad que son "casi" correctas sufren el problema en la primera imagen de arriba: el "súper está en el lugar equivocado" . Debe forzar el tamaño más grande en intrinsicContentSize y luego en textRect # forBounds primero debe reducir los límites de la primera sugerencia y luego llamar a super.
Resumen: debe "llamar a super last " en textRect # forBounds
Ese es el secreto
Tenga en cuenta que no es necesario ni adicionalmente llamar a invalidar, sizeThatFits, needsLayout o cualquier otra llamada forzada. Una solución correcta debería funcionar correctamente en el ciclo normal de extracción automática.
Propina:
Si está trabajando con fuentes monoespaciales, este es un gran consejo: https://stackoverflow.com/a/59813420/294884
fuente
Swift 4+
uso:
fuente
Código Swift 3 con ejemplo de implementación
No olvide agregar el nombre de clase UIMarginLabel en el objeto de etiqueta del guión gráfico. ¡Feliz codificación!
fuente
Según Swift 4.2 (Xcode 10 beta 6) "UIEdgeInsetsInsetRect" está en desuso. También he declarado la clase pública para que sea más útil.
fuente
sizeToFit()
debe ser público como: "El método de instancia de anulación debe ser tan accesible como su tipo deEdité un poco en la respuesta aceptada. Hay un problema cuando aumenta
leftInset
yrightInset
, una parte del texto desaparecerá, b / c el ancho de la etiqueta se reducirá pero la altura no aumenta como figura:Para resolver este problema, debe volver a calcular la altura del texto de la siguiente manera:
y resultado:
Espero ayudar a algunas personas en la misma situación que yo.
fuente
override func drawTextInRect(rect: CGRect)
convierteoverride func drawText(in rect: CGRect)
y seoverride func intrinsicContentSize() -> CGSize
convierte enoverride var intrinsicContentSize : CGSize
Enjoy!override var intrinsicContentSize: CGSize { // .. return intrinsicSuperViewContentSize }
Solo usa autolayout:
Hecho.
fuente
Otra opción sin subclasificar sería:
text
sizeToFit()
luego aumente un poco la altura de la etiqueta para simular el relleno
fuente
label.frame = CGRect( x: label.frame.origin.x - 10, y: label.frame.origin.y - 4, width: label.frame.width + 20,height: label.frame.height + 8)
-10 y -4 para centralizarSwift 3, solución iOS10:
fuente
En Swift 3
mejor y simple manera
fuente
Subclase UILabel. (Archivo-Nuevo-Archivo- CocoaTouchClass-make Subclase de UILabel).
En ViewController:
O Asociar la clase personalizada UILabel en Storyboard como la clase de Label.
fuente
Al igual que otras respuestas, pero corrige un error. Cuando
label.width
está controlado por el diseño automático, a veces el texto se recorta.fuente
Relleno fácil (Swift 3.0, respuesta de Alvin George):
fuente
Una explicación sobre la respuesta de Mundi.
es decir, incrustar una etiqueta en
UIView
ay aplicar el relleno a través del diseño automático. Ejemplo:Visión general:
1) Cree un
UIView
("panel") y configure su apariencia.2) Cree un
UILabel
y agréguelo al panel.3) Agregue restricciones para forzar el relleno.
4) Agregue el panel a su jerarquía de vistas, luego coloque el panel.
Detalles:
1) Crear la vista del panel.
2) Cree la etiqueta, agréguela al panel como una subvista.
3) Agregue restricciones entre los bordes de la etiqueta y el panel. Esto obliga al panel a mantener una distancia de la etiqueta. es decir, "relleno"
Editorial: hacer todo esto a mano es súper tedioso, detallado y propenso a errores. Le sugiero que elija un contenedor de diseño automático de github o escriba uno usted mismo
4) Agregue el panel a su jerarquía de vistas y luego agregue restricciones de posicionamiento. por ejemplo, abrace el lado derecho de una tableViewCell, como en la imagen de ejemplo.
Nota: solo necesita agregar restricciones de posición, no restricciones dimensionales: el diseño automático resolverá el diseño en función tanto
intrinsicContentSize
de la etiqueta como de las restricciones agregadas anteriormente.fuente
Use este código si enfrenta un problema de recorte de texto al aplicar el relleno.
fuente
Similar a otras respuestas, pero con una clase func para configurar dinámicamente el relleno:
fuente
Una solución pragmática es agregar etiquetas en blanco de la misma altura y color que la etiqueta principal. Establezca el espacio inicial / final en la etiqueta principal a cero, alinee los centros verticales y haga que el ancho sea el margen deseado.
fuente
Si desea agregar un relleno de 2px alrededor del textRect, simplemente haga esto:
fuente
Si no desea o necesita usar un UIBabel @IBInspectable / @IBDesignable en Storyboard (creo que de todos modos se procesan demasiado lento), entonces es más limpio usar UIEdgeInsets en lugar de 4 CGFloats diferentes.
Ejemplo de código para Swift 4.2:
fuente
C objetivo
Basado en la respuesta de Tai Le que implementa la función dentro de un Designable IB, aquí está la versión Objective-C.
Pon esto en YourLabel.h
Y esto iría en YourLabel.m
Luego puede modificar las inserciones de YourLabel directamente en Interface Builder después de especificar la clase dentro del XIB o el guión gráfico, el valor predeterminado de las inserciones es cero.
fuente
Manera fácil
fuente
Acolchado fácil:
fuente
Swift 4+
fuente