cómo hacer UITextView altura dinámica de acuerdo a la longitud del texto?

Como se puede ver en esta imagen

la UITextView cambios es la altura de acuerdo a la longitud del texto, quiero hacer es ajustar su altura de acuerdo a la longitud del texto.

*Vi a otras preguntas, pero las soluciones no trabajo para mí

cómo hacer UITextView altura dinámica de acuerdo a la longitud del texto?

Posibles duplicados de ¿Cómo puedo tamaño de un UITextView a su contenido?
Yo uso nextGrowingTextView github.com/muukii/NextGrowingTextView incluso he escrito una implementación en c Objetivo github.com/mcmatan/NextGrowingInternalTextViewObjectiveC
CSGrowingTextView es también una alternativa para este problema: github.com/cloverstudio/CSGrowingTextView

OriginalEl autor DeyaEldeen | 2016-08-02

11 Kommentare

  1. 66

    este Obras para mí, todas las otras soluciones no.

    func adjustUITextViewHeight(arg : UITextView)
    {
        arg.translatesAutoresizingMaskIntoConstraints = true
        arg.sizeToFit()
        arg.scrollEnabled = false
    }

    En Swift 4 la sintaxis de arg.scrollEnabled = false ha cambiado a arg.isScrollEnabled = false.

    Cuando hay un gran texto, a continuación, el texto no se muestra cuando hago falsas para scrollEnabled de la propiedad. Puede usted por Favor me ayude con eso. ? Me refiero a que el texto está ahí, pero que no es visible.
    por favor, pregunte una pregunta aparte con el código completo y storyboards detalles.
    funciona y también he probado con estática en formato tableview celular, excelente 🙂

    OriginalEl autor DeyaEldeen

  2. 14

    Dar a este un intento:

    CGRect frame = self.textView.frame;
    frame.size.height = self.textView.contentSize.height;
    self.textView.frame = frame;

    Editar – Aquí está el Swift:

    var frame = self.textView.frame
    frame.size.height = self.textView.contentSize.height
    self.textView.frame = frame
    este es obj-c, uso de swift.
    Muy muy similar. consulte edición de @DeyaEldeen
    ok, gracias, voy a probar esta también, y que te diga el resultado.
    no funciona conmigo 🙁

    OriginalEl autor John Farkerson

  3. 7

    Seguido por DeyaEldeen la respuesta.

    En mi caso. Me crecen los textview altura de forma automática mediante la adición

    swift 3

    textView.translatesAutoresizingMaskIntoConstraints = false
    textView.isScrollEnabled = false

    OriginalEl autor Brady Huang

  4. 4

    Swift 4

    Añadir A Su Clase

    UITextViewDelegate

    func textViewDidChange(_ textView: UITextView) {
          let fixedWidth = textView.frame.size.width
          textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
          let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
          var newFrame = textView.frame
          newFrame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)
          textView.frame = newFrame
    }
    Funcionó bien como mi necesidad.Pero textview teclado no es la apertura de la segunda Vez en adelante, excepto para la primera línea..¿alguien puede ayudarme.
    textView.translatesAutoresizingMaskIntoConstraints = true también es necesario
    me has salvado realmente muchas gracias

    OriginalEl autor ZAFAR007

  5. 3

    En el Guión gráfico /Interface Builder, simplemente desactive el desplazamiento en el Atributo inspector.

    En el código textField.isScrollEnabled = false debe hacer el truco.

    OriginalEl autor Tum

  6. 2

    es sencillo de hacer en el programática. sólo tienes que seguir estos pasos

    1. agregar un observador a la longitud del contenido del textfield

      [yourTextViewObject addObserver:self forKeyPath:@"contentSize" options:(NSKeyValueObservingOptionNew) context:NULL];
    2. implementar observador

      -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
      UITextView *tv = object;
      
          //Center vertical alignment
          CGFloat topCorrect = ([tv bounds].size.height - [tv contentSize].height * [tv zoomScale])/2.0;
          topCorrect = ( topCorrect < 0.0 ? 0.0 : topCorrect );
          tv.contentOffset = (CGPoint){.x = 0, .y = -topCorrect};
      
      
          mTextViewHeightConstraint.constant = tv.contentSize.height;
      
          [UIView animateWithDuration:0.2 animations:^{
      
              [self.view layoutIfNeeded];
          }];
      
      }
    3. si quieres dejar de textviewHeight a aumentar después de algún tiempo durante la escritura, a continuación, implementar y textview delegado a sí mismo.

      -(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
      {
          if(range.length + range.location > textView.text.length)
          {
              return NO;
          }
      
          NSUInteger newLength = [textView.text length] + [text length] - range.length;
      
          return (newLength > 100) ? NO : YES;
      
      }
    este es obj-c, uso de swift.
    uy , plz escribir código correspondiente .. 🙂
    he añadido el swift de la etiqueta en la pregunta, así que es todo acerca de swift.
    ok .. voy a actualizar .
    gracias, señor!

    OriginalEl autor Shaik Riyaz

  7. 2

    acaba de hacer una conexión con el textView de la altura de la Restricción

    @IBOutlet var textView: UITextView!
    @IBOutlet var textViewHeightConstraint: NSLayoutConstraint!

    y el uso de este código siguiente

    textViewHeightConstraint.constant = self.textView.contentSize.height

    OriginalEl autor Rishabh Shukla

  8. 1

    su trabajo

    func textViewDidChange(_ textView: UITextView) {
        let fixedWidth = textviewconclusion.frame.size.width
        textviewconclusion.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
        let newSize = textviewconclusion.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
        var newFrame = textviewconclusion.frame
        newFrame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)
        textviewconclusion.frame = newFrame
    }

    OriginalEl autor OneTeam

  9. 0

    Aquí hay dos escollos en iOS 8.3 cuando viene con textView.textContainer.maximumNumberOfLines = 10

    Referirse a mi esencia, por favor.

    textView.attributedText = originalContent
    
    let lineLimit = 10
    textView.isEditable = true
    textView.isScrollEnabled = false
    textView.textContainerInset = .zero //default is (8, 0, 8, 0)
    textView.textContainer.maximumNumberOfLines = lineLimit //Important condition
    textView.textContainer.lineBreakMode = .byTruncatingTail
    
    //two incomplete methods, which do NOT work in iOS 8.3
    
    //size.width可能比maxSize.width小 ————遗憾的是 iOS 8.3 上此方法无视maximumNumberOfLines参数,所以得借助于UILabel
    //size.width may be less than maxSize.width, ---- Do NOT work in iOS 8.3, which disregards textView.textContainer.maximumNumberOfLines
    //let size = textView.sizeThatFits(maxSize) 
    
    //遗憾的是 iOS 8.3 上此方法失效了,得借助于UILabel
    //Does not work in iOS 8.3
    //let size = textView.layoutManager.usedRectForTextContainer(textView.textContainer).size 
    
    //Suggested method: use a temperary label to get its size
    let label = UILabel(); label.attributedText = originalContent
    let size = label.textRect(forBounds: CGRect(origin: .zero, size: maxSize), limitedToNumberOfLines: lineLimit).size
    textView.frame.size = size

    OriginalEl autor DawnSong

  10. 0

    1 Agregar un observador a la longitud del contenido del textfield

       yourTextView.addObserver(self, forKeyPath: "contentSize", options: (NSKeyValueObservingOptions.new), context: nil);

    2 Implementar observador

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
            let tv = object as! UITextView;
            var topCorrect = (tv.bounds.size.height - tv.contentSize.height * tv.zoomScale)/2.0;
            topCorrect = ( topCorrect < 0.0 ? 0.0 : topCorrect );
            tv.contentOffset.x = 0;
            tv.contentOffset.y = -topCorrect;
            self.yourTextView.contentSize.height = tv.contentSize.height;
            UIView.animate(withDuration: 0.2, animations: {
                self.view.layoutIfNeeded();
            });
        }

    OriginalEl autor Sachin Nikumbh

  11. 0

    SWIFT 4

    Cambiar de tamaño cuando inflexión

    UITextViewDelegate

    func textViewDidChange(_ textView: UITextView) {
            yourTextView.translatesAutoresizingMaskIntoConstraints = true
            yourTextView.sizeToFit()
            yourTextView.isScrollEnabled = false
    
            let calHeight = yourTextView.frame.size.height
            yourTextView.frame = CGRect(x: 16, y: 193, width: self.view.frame.size.width - 32, height: calHeight)
        }

    Cambiar de tamaño cuando se carga

    func textViewNotasChange(arg : UITextView) {
            arg.translatesAutoresizingMaskIntoConstraints = true
            arg.sizeToFit()
            arg.isScrollEnabled = false
    
            let calHeight = arg.frame.size.height
            arg.frame = CGRect(x: 16, y: 40, width: self.view.frame.size.width - 32, height: calHeight)
        }

    Función de la llamada de la segunda opción como esta:

    textViewNotasChange(arg: yourTextView)

    OriginalEl autor oscar castellon

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea