Cuando he texto que no se llene el UITextView, se ha desplazado a la parte superior funcionando según lo previsto. Cuando hay más texto del que cabe en la pantalla, el UITextView se desplaza a la mitad del texto, en lugar de en la parte superior.

Aquí están algunos potencialmente detalles relevantes:

En viewDidLoad a dar algunos relleno en la parte superior y la parte inferior de UITextView:

self.mainTextView.textContainerInset = UIEdgeInsetsMake(90, 0, 70, 0);

La UITextView utiliza diseño automático para anclarlo 20 píxeles de la parte superior, inferior y a cada lado de la pantalla (hecho en IB) para permitir diferentes tamaños de pantalla y orientaciones.

Me puede desplazarse todavía con mi dedo una vez que su carga.

EDITAR
He encontrado que la eliminación de las auto restricciones de diseño y, a continuación, la fijación de la anchura de sólo parece solucionar el problema, pero sólo para que la anchura de la pantalla.

10 Comentarios

  1. 18

    UITextView es una subclase de UIScrollView, así que usted puede utilizar sus métodos. Si todo lo que quiero hacer es asegurarse de que está desplazado a la parte superior, donde el texto se agrega a tratar:

    [self.mainTextView setContentOffset:CGPointZero animated:NO];

    EDICIÓN: Autodiseño con cualquier tipo de scrollview obtiene wonky rápido. Que el establecimiento de un ancho fijo resuelve que no es de extrañar. Si no funciona en -viewDidLayoutSubviews, a continuación, que es impar. La configuración de un esquema de restricción manualmente puede trabajar. Crear primero las restricciones en IB:

    @property (weak, nonatomic) IBOutlet NSLayoutConstraint *textViewWidthConstraint;
    @property (weak, nonatomic) IBOutlet NSLayoutConstraint *textViewHeightConstraint;

    a continuación, en el ViewController

        -(void)updateViewConstraints {
                self.textViewWidthConstraint.constant = self.view.frame.size.width - 40.0f;
                self.textViewHeightConstraint.constant = self.view.frame.size.height - 40.0f;
                [super updateViewConstraints];
            }

    Puede ser necesario para setContentOffset en -viewDidLayoutSubviews.

    (Otro método sería crear un esquema de restricción para «la’igualdad’ anchos» y «la’igualdad’ alturas» entre el textView y su superView, con una constante de «-40». Es sólo la ‘igualdad’ si la constante es cero, de lo contrario, se ajusta por la constante. Pero debido a que sólo se puede añadir esta restricción a la vista de que las restricciones de ambos puntos de vista, usted no puede hacer esto en IB.)

    Usted puede preguntarse, si tengo que hacer esto, ¿cuál es el punto de Autodiseño? He estudiado diseño Automático en profundidad, y que es una excelente pregunta.

    • Yo debería haber mencionado que había intentado eso y no funciona. Lo puse en viewDidLoad y viewDidLayoutSubviews, tampoco funcionó
    • He actualizado mi respuesta. Diseño automático es un mundo de dolor, trate de no pensar sobre el tiempo y la frustración que le había salvado si usted acaba de utilizar setFrame.
    • Qué pesadilla!. Me hizo llegar al trabajo final y terminó con la igualdad de altura/anchura de método con una constante de -40. Es necesario tener setContentOffset en viewDidLayoutSubviews. Muchas gracias.
  2. 113

    agregue la siguiente función de su punto de vista de la clase controlador…

    Swift 3

    override func viewDidLayoutSubviews() {
        self.mainTextView.setContentOffset(.zero, animated: false)
    }

    Swift 2.1

    override func viewDidLayoutSubviews() {
        self.mainTextView.setContentOffset(CGPointZero, animated: false)
    }

    Objetivo C

    - (void)viewDidLayoutSubviews {
        [self.mainTextView setContentOffset:CGPointZero animated:NO];
    }
    • Después de un montón de respuestas en temas similares, esto funcionó para mí. Gracias 🙂
    • Este trabajó para mí, gracias a ti 🙂
    • Con la vista de texto metiendo la mano DEBAJO de la barra de navegación, esto funciona, pero sólo con un ajuste de offset así: textView.setContentOffset(CGPoint(x: 0.0, y: -textView.contentInset.la parte superior), animados: false) — Suponiendo que el texto de la vista del contenido de inserción de las hojas de la correcta espacio en blanco en la parte superior.
    • En Swift 3, CGPointZero, debe ser .zero.
    • Encuentra las respuestas pero esto sólo funcionó para mí.
    • También asegúrese de llamar siempre super cuando se reemplaza la UIViewController métodos del ciclo de vida.

  3. 10

    Swift

    self.textView.scrollRangeToVisible(NSMakeRange(0, 0))

    Objective-C

    [self.textView scrollRangeToVisible:(NSMakeRange(0, 0))];
    • Por alguna razón esto funcionó para mí y setContentOffset no…. Sólo estoy carga de datos desde un archivo rtf para ser mostrado en una normal UITextView. ¿Por qué sería?
  4. 9

    yo tenía el mismo problema! Restablecer sugirió que limita y acaba de poner (y offset)

    @IBOutlet weak var textContent: UITextView!
    
        override func viewDidLoad() {
            textContent.scrollsToTop = true
            var contentHeight = textContent.contentSize.height
            var offSet = textContent.contentOffset.x
            var contentOffset = contentHeight - offSet
            textContent.contentOffset = CGPointMake(0, -contentOffset)
        }
    • Gracias! Esto funcionó para mí. Obj-C equivalente : <code> -(void)viewWillAppear:(BOOL)animadas{ [super viewWillAppear:animación]; CGFloat contentHeight = auto.textView.contentSize.altura; CGFloat offSet = auto.textView.contentOffset.x; CGFloat contentOffset = contentHeight – offSet; auto.textView.contentOffset = CGPointMake(0, -contentOffset); } <\código de>
  5. 6

    Para iOS9 y más tarde el textview incluso en viewWillAppear: viene con CGRect(0,0,1000,1000). En orden para que esto funcione, usted tiene que llamar en viewWillAppear:

    [self.view setNeedsLayout];
    [self.view layoutIfNeeded];
    //* Your code here

    Después de que el textview tendrá correcta CGRect de datos y se puede realizar cualquier operación de desplazamiento que usted puede necesitar.

    • Gracias por que sólo la solución de trabajo desde IOS9
  6. 2

    El problema con poner el código en viewDidLayoutSubviews y viewWillLayoutSubviews es que se llama a estos métodos mucho (durante la rotación del dispositivo, el tamaño de las vistas, etc …). Si estás leyendo algo de la vista de texto, y girar el dispositivo, se espera que la parte del contenido que estás viendo permanece en la pantalla. No se espera que se desplaza de nuevo a la parte superior.
    En lugar de desplazarse por el contenido de la parte superior, trate de mantener el texto de la vista scrollEnabled de la propiedad se establece en NO (false), y encenderlo de nuevo en viewDidAppear.

    • Gracias, esto hace mucho más sentido! 🙂
  7. 1

    Si usted no quiere meterse con restricciones:

    override func updateViewConstraints() {
        super.updateViewConstraints()
    }
    
    override func viewDidLayoutSubviews() {
        self.textLabel.setContentOffset(CGPointZero, animated: false)
    }
    • Usted puede eliminar su updateViewConstraints() implementación de su ejemplo; un método que no hace nada pero llame a su super es lo mismo que la implementación en todos. 🙂
    • para swift 3: reemplazar func viewDidLayoutSubviews() { self.infoText.setContentOffset(CGPoint(), animados: false) }
  8. 1

    Este es un interesante fallo. En nuestro proyecto, esto se produce sólo en dispositivos con un iPhone 5-tamaño de pantalla. Parece que el textview contentOffset cambia en algún momento durante el controlador de vista del ciclo de vida. En viewDidLoad y viewWillAppear el textview de la contentOffset es 0,0, y por viewDidAppear de lo que ha cambiado. Usted puede ver lo que está sucediendo en viewWillLayoutSubviews. Limitaciones parecen ser configurado correctamente.

    Esto asegurará que usted no llama a un método de desplazamiento a menos que sea necesario:

    if textView.contentOffset.y > 0 {
        textView.contentOffset = CGPoint(x: 0, y: 0)
        //Or use scrollRectToVisible, scrollRangeToVisible, etc.
    }
  9. 1

    Para mí esto funciona de una manera diferente, he intentado de todas las cosas mencionadas anteriormente, pero ninguno de los trabajado en func viewWillAppear(_ animated: Bool). Que finalmente hace textView desplaza hacia arriba, y en func viewDidAppear(_ animated: Bool) sería de desplazamiento después de la pantalla apareció.

    A continuación trabajó para mí, pero tiene algunas restricciones relacionadas con el problema con el teclado hacia arriba y hacia abajo.

    override func viewDidLayoutSubviews() {
        self.textView.setContentOffset(.zero, animated: false)
    }

    A continuación trabajó como expectativa:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        self.textView.scrollsToTop = true
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.view.layoutIfNeeded()
        self.textView.setContentOffset(.zero, animated: false)
    }
  10. 0

    Swift

    override func viewDidLoad() {
        super.viewDidLoad()  
        textView.isScrollEnabled = false  
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        textView.isScrollEnabled = true
    }

Dejar respuesta

Please enter your comment!
Please enter your name here