ios - fields - ¿Cómo perder margen/relleno en UITextView?




text field xcode (13)

Tengo una UITextView en mi aplicación iOS, que muestra una gran cantidad de texto. A continuación, estoy paginando este texto utilizando el parámetro de margen de desplazamiento de la UITextView . Mi problema es que el relleno del UITextView confunde mis cálculos, ya que parece ser diferente según el tamaño de fuente y el tipo de letra que uso.

Por lo tanto, planteo la pregunta: ¿Es posible eliminar el relleno que rodea el contenido de la UITextView ?

Esperamos escuchar sus respuestas!


Para 2018

Es uno de los errores más tontos en iOS.

La clase UITextViewFixed es generalmente una solución razonable.

Aquí está la clase:

@IBDesignable class UITextViewFixed: UITextView {
    override func layoutSubviews() {
        super.layoutSubviews()
        setup()
    }
    func setup() {
        textContainerInset = UIEdgeInsets.zero
        textContainer.lineFragmentPadding = 0
    }
}

¡No olvide apagar scrollEnabled en el Inspector!

  1. La solución funciona correctamente en el guión gráfico.

  2. La solución funciona correctamente en tiempo de ejecución

Eso es todo, ya está hecho.

En general, eso debería ser todo lo que necesita en la mayoría de los casos .

Incluso si está cambiando la altura de la vista de texto sobre la marcha, esto generalmente hace todo lo que necesita.

(Un ejemplo común de cambio de altura sobre la marcha, es cambiarlo según el tipo de usuario).

Aquí está el UITextView roto de Apple ...

Aquí está UITextViewFixed :

Tenga en cuenta que por supuesto usted debe

apagar scrollEnabled en el inspector!

No te olvides de apagar scrollEnabled! :)

Algunos problemas adicionales

(1) En algunos casos inusuales, por ejemplo, algunos casos de vistas de tabla de altura de celda flexible con altura que cambia dinámicamente, Apple hace la cosa más molesta del mundo: agrega espacio adicional en la parte inferior . ¡No realmente! Esta tendría que ser una de las cosas más molestas en iOS.

Aquí hay una "solución rápida" para agregar que a menudo ayuda con esa locura.

...
        textContainerInset = UIEdgeInsets.zero
        textContainer.lineFragmentPadding = 0

        // this is not ideal, but you can sometimes use this
        // to fix the "space at bottom" insanity
        var b = bounds
        let h = sizeThatFits(CGSize(
           width: bounds.size.width,
           height: CGFloat.greatestFiniteMagnitude)
       ).height
       b.size.height = h
       bounds = b
 ...

(2) A veces, para arreglar otro problema sutil de Apple, debes agregar esto:

override func setContentOffset(_ contentOffset: CGPoint, animated: Bool) {
    super.setContentOffset(contentOffset, animated: false)
}

(3) Podría decirse que deberíamos agregar:

contentInset = UIEdgeInsets.zero

justo después de .lineFragmentPadding = 0 en UITextViewFixed . Sin embargo ... simplemente no funciona en iOS actual! Puede ser necesario agregar eso en el futuro.

El hecho de que UITextView esté totalmente roto en iOS es una de las cosas más extrañas de toda la computación móvil.

Finalmente, aquí hay una sugerencia algo similar para el campo de texto: https://.com/a/43099816/294884


Último Swift

self.textView.textContainerInset = .init (arriba: -2, izquierda: 0, abajo: 0, derecha: 0) self.textView.textContainer.lineFragmentPadding = 0


Aquí hay una pequeña extensión fácil que eliminará el margen predeterminado de Apple de cada vista de texto en su aplicación.

Nota: Interface Builder seguirá mostrando el margen anterior, pero su aplicación funcionará como se esperaba.

extension UITextView {

   open override func awakeFromNib() {
      super.awakeFromNib();
      removeMargins();
   }

   /** Removes the Apple textview margins. */
   public func removeMargins() {
      self.contentInset = UIEdgeInsetsMake(
         0, -textContainer.lineFragmentPadding,
         0, -textContainer.lineFragmentPadding);
   }
}

Aquí hay una versión actualizada de la respuesta muy útil de Fattie. Agrega 2 líneas muy importantes que me ayudaron a obtener un diseño perfecto para iOS 10 y 11 (y probablemente también para las más bajas).
re

@IBDesignable class UITextViewFixed: UITextView {
    override func layoutSubviews() {
        super.layoutSubviews()
        setup()
    }
    func setup() {
        translatesAutoresizingMaskIntoConstraints = true
        textContainerInset = UIEdgeInsets.zero
        textContainer.lineFragmentPadding = 0
        translatesAutoresizingMaskIntoConstraints = false
    }
}

¡Las líneas importantes son las dos declaraciones translatesAutoresizingMaskIntoConstraints = <true/false> !

¡Esto elimina sorprendentemente todos los márgenes en todas mis circunstancias!

Si bien textView no es el primer respondedor, puede suceder que haya un margen inferior extraño que no se pueda resolver con el método sizeThatFits que se menciona en la respuesta aceptada.
Al tocar el textView, de repente, el extraño margen inferior desapareció y todo parecía que debía, pero solo en cuanto el textView tiene el primer firstResponder .

Así que leí aquí en SO que habilitar y deshabilitar translatesAutoresizingMaskIntoConstraints ayuda al configurar el marco / límites manualmente entre las llamadas.

Afortunadamente, esto no solo funciona con la configuración del marco, sino también con las 2 líneas de setup() intercaladas entre las dos translatesAutoresizingMaskIntoConstraints .

Esto, por ejemplo, es muy útil cuando se calcula el marco de una vista utilizando systemLayoutSizeFitting en una UIView . Devuelve el tamaño correcto (que anteriormente no lo hacía)!

Como en la respuesta original mencionada:
¡No olvide apagar scrollEnabled en el Inspector!
Esa solución funciona correctamente en el guión gráfico, así como en el tiempo de ejecución.

Eso es todo, ¡ya está hecho!


En iOS 5 UIEdgeInsetsMake(-8,-8,-8,-8); Parece funcionar muy bien.


Haciendo la solución de inserción todavía tenía relleno en el lado derecho y en la parte inferior. También la alineación del texto estaba causando problemas. La única manera segura que encontré fue colocar la vista de texto dentro de otra vista que está recortada a límites.


Para iOS 10, la siguiente línea funciona para la eliminación del relleno superior e inferior.

captionTextView.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0)

Para iOS 7.0, he encontrado que el truco contentInset ya no funciona. Este es el código que usé para deshacerme del margen / relleno en iOS 7.

Esto lleva el borde izquierdo del texto al borde izquierdo del contenedor:

textView.textContainer.lineFragmentPadding = 0

Esto hace que la parte superior del texto se alinee con la parte superior del contenedor

textView.textContainerInset = .zero

Ambas líneas son necesarias para eliminar completamente el margen / relleno.


Puedes usar la propiedad UITextView de UITextView :

textView.textContainerInset = UIEdgeInsetsMake (10, 10, 10, 10);

(arriba a la izquierda, abajo a la derecha)


Storyboard o solución Interface Builder, utilizando atributos de tiempo de ejecución definidos por el usuario. Actualizar. Se agregaron capturas de pantalla de iOS7.1 y iOS6.1 con contentInset = {{-10, -5}, {0, 0}}


Definitivamente evitaría cualquier respuesta que involucre valores codificados, ya que los márgenes reales pueden cambiar con la configuración de tamaño de fuente del usuario, etc.

Aquí está la respuesta de @ user1687195, escrita sin modificar el textContainer.lineFragmentPadding (porque la docs indica que este no es el uso previsto).

Esto funciona muy bien para iOS 7 y versiones posteriores.

self.textView.textContainerInset = UIEdgeInsetsMake(
                                      0, 
                                      -self.textView.textContainer.lineFragmentPadding, 
                                      0, 
                                      -self.textView.textContainer.lineFragmentPadding);

Este es efectivamente el mismo resultado, solo un poco más limpio, ya que no hace mal uso de la propiedad lineFragmentPadding.


Esta solución se escribió en 2009 cuando se lanzó iOS 3.0. Ya no se aplica.

Me encontré con el mismo problema, al final tuve que terminar usando

nameField.contentInset = UIEdgeInsetsMake(-4,-8,0,0);

donde nameField es un UITextView . La fuente que estaba usando era Helvetica 16 puntos. Es solo una solución personalizada para el tamaño de campo particular que estaba dibujando. Esto hace que el offset izquierdo quede al ras con el lado izquierdo, y el offset superior donde lo quiero para el cuadro en el que se dibuja.

Además, parece que esto solo se aplica a UITextViews en las que está usando la alineación predeterminada, es decir.

nameField.textAlignment = NSTextAlignmentLeft;

Alinear a la derecha, por ejemplo, y el UIEdgeInsetsMake parece no tener ningún impacto en el borde derecho en absoluto.

Como mínimo, el uso de la propiedad .contentInset le permite colocar sus campos con las posiciones "correctas", y acomodar las desviaciones sin compensar sus UITextViews .


[firstNameTextField setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter];






uitextview