He estado usando el aceptado respuesta aquí durante años.

En iOS 7, la contentSize.la altura se convierte en el marco.altura-8, independientemente de los contenidos de texto.

¿Qué es un método de trabajo para ajustar la altura en iOS 7?

  • Yo estoy en el mismo problema. Veo que agregaron textContainer a UIView que tiene un tamaño, pero actualmente estoy ver el tamaño de ser inexactos.

13 Comentarios

  1. 55

    Estoy a favor de este mínimo cambio de código: Sólo hay que añadir estas dos líneas después de addSubview y antes de agarrar el height de la frame

    ...
    [scrollView1 addSubview: myTextView];
    
        [myTextView sizeToFit]; //added
        [myTextView layoutIfNeeded]; //added
    
    CGRect frame = myTextView.frame;
    ...
    

    Esta prueba compatible con iOS 6. NOTA que se shrink-wrap el ancho. Si usted está interesado en la altura y tienen un ancho fijo, acaba de agarrar a la nueva altura, pero establecer la anchura original, y funciona igual que antes tanto en iOS 6 y 7.

    (Especulación: no tamaño para que quepa en iOS 7, pero el diseño se actualiza más tarde o en un hilo separado, y que esto obliga a que el diseño de inmediato para que su marco se actualiza en el tiempo para el uso de su valor de la altura de un par de líneas más adelante en el mismo hilo.)

    NOTAS:

    1) Usted podría o no han implementado el contenedor exterior el tamaño de esta manera. Parece ser un fragmento, a pesar de que, y lo he utilizado en mis proyectos.

    2) Desde sizeToFit parece funcionar como se espera en iOS 7, es probable que no necesita de la prematura addSubView. Si va a funcionar en iOS 6, a continuación, no está probado por mí.

    3) Especulación: La extra layoutIfNeeded mediados de hilo puede ser costoso. La alternativa que yo veo es para cambiar el tamaño del contenedor exterior en el diseño de devolución de llamada (despedido o no, dependiendo de si el sistema operativo decide si el diseño es necesaria o no) donde el contenedor exterior redimensionar hará otra presentación de la actualización. Ambas actualizaciones pueden ser combinados con otros de diseño actualizaciones a ser más eficientes. Si usted hacer tiene una solución y usted puede demostrar que es más eficiente, agregar como respuesta y voy a estar seguro para mencionar aquí.

    • Se redimensiona textview, pero todavía no logran cambiar el tamaño de textview del elemento primario con esto en iOS 7, puede usted por favor compartir más detalles ?
    • Ni idea, muy poca información. Pero si usted escribe una pregunta con el código que no funciona me podría echar un vistazo.
    • no funcionó para mí en iOS 7 con carácter de nueva línea en el texto
    • ya he publicado la respuesta que yo he usado en todas las aplicaciones que he actualizado en la app store, supongo que más o menos cinco. Algunas de texto vistas eran de una sola línea, algunos eran de varias líneas. Me pueden actualizar otro día de hoy, podrían tener una mirada en los últimos OS 7.1.x.
  2. 33

    Ya estoy usando Diseño Automático, yo uso el valor de [textView sizeThatFits:CGSizeMake(textView.frame.size.width, CGFLOAT_MAX)].height a actualizar la constant de la textView‘s altura UILayoutConstraint.

    • gracias, esto es útil. tenía la esperanza de cambiar el tamaño como el tipo I, aunque. Supongo que lo mejor que puedo pedir es poner el tamaño de la lógica en el delegado del textFieldDidEndEditing ?
    • MattDiPasquale, No debo poner estos código? En viewDidLoad, layoutSubviews o más?
    • layoutSubviews o viewWillAppear.
    • Este NSLayoutConstraint se configura con una constante que supera los límites internos. Un valor menor será sustituido, pero este problema debería estar solucionado. Salto en el vacío _NSLayoutConstraintNumberExceedslimit() para depurar. Esto se registra sólo una vez. Esto puede romper en el futuro. -[<_UITextTiledLayer: 0x7fd9a8dcfac0> pantalla]: Ignorando falso el tamaño de la capa (375.000000, 1000000000.000000), contentsScale 2.000000, almacén de respaldo tamaño (750.000000, 2000000000.000000)
    • Ni idea de por qué esto no ha sido marcado como aceptado respuesta 🙂 Pero u sir 🙂 me Salvó el día con este trozo de código: a), de Ahí hasta votado 🙂
  3. 17

    Yo uso una versión adaptada de madmik la respuesta que elimina el factor de elusión:

    - (CGFloat)measureHeightOfUITextView:(UITextView *)textView
    {
        if ([textView respondsToSelector:@selector(snapshotViewAfterScreenUpdates:)])
        {
            //This is the code for iOS 7. contentSize no longer returns the correct value, so
            //we have to calculate it.
            //
            //This is partly borrowed from HPGrowingTextView, but I've replaced the
            //magic fudge factors with the calculated values (having worked out where
            //they came from)
    
            CGRect frame = textView.bounds;
    
            //Take account of the padding added around the text.
    
            UIEdgeInsets textContainerInsets = textView.textContainerInset;
            UIEdgeInsets contentInsets = textView.contentInset;
    
            CGFloat leftRightPadding = textContainerInsets.left + textContainerInsets.right + textView.textContainer.lineFragmentPadding * 2 + contentInsets.left + contentInsets.right;
            CGFloat topBottomPadding = textContainerInsets.top + textContainerInsets.bottom + contentInsets.top + contentInsets.bottom;
    
            frame.size.width -= leftRightPadding;
            frame.size.height -= topBottomPadding;
    
            NSString *textToMeasure = textView.text;
            if ([textToMeasure hasSuffix:@"\n"])
            {
                textToMeasure = [NSString stringWithFormat:@"%@-", textView.text];
            }
    
            //NSString class method: boundingRectWithSize:options:attributes:context is
            //available only on ios7.0 sdk.
    
            NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
            [paragraphStyle setLineBreakMode:NSLineBreakByWordWrapping];
    
            NSDictionary *attributes = @{ NSFontAttributeName: textView.font, NSParagraphStyleAttributeName : paragraphStyle };
    
            CGRect size = [textToMeasure boundingRectWithSize:CGSizeMake(CGRectGetWidth(frame), MAXFLOAT)
                                                      options:NSStringDrawingUsesLineFragmentOrigin
                                                   attributes:attributes
                                                      context:nil];
    
            CGFloat measuredHeight = ceilf(CGRectGetHeight(size) + topBottomPadding);
            return measuredHeight;
        }
        else
        {
            return textView.contentSize.height;
        }
    }
    
    • Puedo resolver contenido de la altura de UITextView es iOS 7 de doma código. Gracias.
    • No se adapta cuando el usuario pulsa retorno. Nueva línea recortada hasta que se escribe el texto.
    • funciona muy bien para mi, gracias 🙂 para evitar que las líneas recortadas, simplemente uso [self.textView scrollRangeToVisible:NSMakeRange(0,0)]; cuando se detectan diferentes a la altura de la línea
  4. 16

    Basado en otras respuestas, me hizo el trabajo(en Swift).
    Esto resuelve el problema con carácter de nueva línea.

    textView.sizeToFit()
    textView.layoutIfNeeded()
    let height = textView.sizeThatFits(CGSizeMake(textView.frame.size.width, CGFloat.max)).height
    textView.contentSize.height = height
    

    Diseño automático es necesario.

  5. 15

    Si usted está utilizando el Diseño Automático, usted podría crear un trivial UITextView subclase que la auto-tamaños de la vista de texto de altura para ajustar el contenido:

    @interface ContentHeightTextView : UITextView
    
    @end
    
    @interface ContentHeightTextView ()
    @property (nonatomic, strong) NSLayoutConstraint *heightConstraint;
    @end
    
    @implementation ContentHeightTextView
    
    - (void)layoutSubviews
    {
        [super layoutSubviews];
    
        CGSize size = [self sizeThatFits:CGSizeMake(self.bounds.size.width, FLT_MAX)];
    
        if (!self.heightConstraint) {
            self.heightConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:1.0f constant:size.height];
            [self addConstraint:self.heightConstraint];
        }
    
        self.heightConstraint.constant = size.height;
    
        [super layoutSubviews];
    }
    
    @end
    

    De curso, a la vista del texto de la anchura y la posición debe ser definido por las restricciones adicionales configurado en el resto del programa.

    Si usted cree que esta costumbre se vista de texto en IB, dar la vista del texto de una altura de restricción con el fin de satisfacer Xcode; sólo asegúrese de que la altura de la restricción creado en IB es simplemente un marcador de posición (es decir, marque la casilla que dice «Quitar de en tiempo de compilación»).

    ¿Cómo puedo tamaño de un UITextView a su contenido en iOS 7?

    Una forma alternativa de implementar el UITextView subclase es la siguiente (esta aplicación se puede calificar como la mejor práctica):

    @interface ContentHeightTextView ()
    @property (nonatomic, strong) NSLayoutConstraint *heightConstraint;
    @end
    
    @implementation ContentHeightTextView
    
    - (void)layoutSubviews
    {
        [super layoutSubviews];
    
        [self setNeedsUpdateConstraints];
    }
    
    - (void)updateConstraints
    {
        CGSize size = [self sizeThatFits:CGSizeMake(self.bounds.size.width, FLT_MAX)];
    
        if (!self.heightConstraint) {
            self.heightConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:1.0f constant:size.height];
            [self addConstraint:self.heightConstraint];
        }
    
        self.heightConstraint.constant = size.height;
        [super updateConstraints];
    }
    
    @end
    
    • Muy bonito! Y muy útil! 😀 Gracias!!
    • Creo que la creación de subclases UITextView y trabajar con la altura de la restricción es la mejor solución cuando se trata de auto-presentación.Gracias.
  6. 4

    Si usted está utilizando auto-presentación, puede utilizar el siguiente UITextView la subclase a la que añade una característica intrínseca de altura:

    @implementation SelfSizingTextView
    
    - (void)setText:(NSString *)text
    {
        [super setText:text];
        [self invalidateIntrinsicContentSize];
    }
    
    - (void)setFont:(UIFont *)font
    {
        [super setFont:font];
        [self invalidateIntrinsicContentSize];
    }
    
    - (CGSize)intrinsicContentSize
    {
        CGFloat width = self.frame.size.width;
        CGSize size = [self sizeThatFits:CGSizeMake(width, MAXFLOAT)];
        return CGSizeMake(UIViewNoIntrinsicMetric, size.height);
    }
    
    @end
    
    • A mí me funcionó en iOS 7.0. Pero no ver en iOS > 7.0. Gracias @phatmann.
    • La documentación para el intrinsicContentSize decir: This intrinsic size must be independent of the content frame, because there’s no way to dynamically communicate a changed width to the layout system based on a changed height. Así que mi código no es realmente kosher. En iOS 7 se trabajó, pero no es confiable en iOS 8. Si usted está utilizando auto-dimensionamiento de las células en iOS 8, entonces usted puede utilizar preferredLayoutAttributesFittingAttributes:
  7. 3

    este método parece funcionar.

    //Code from apple developer forum - @Steve Krulewitz, @Mark Marszal, @Eric Silverberg
    - (CGFloat)measureHeight
    {
    if ([self respondsToSelector:@selector(snapshotViewAfterScreenUpdates:)])
    {
        CGRect frame = internalTextView.bounds;
        CGSize fudgeFactor;
        //The padding added around the text on iOS6 and iOS7 is different.
        fudgeFactor = CGSizeMake(10.0, 16.0);
    
        frame.size.height -= fudgeFactor.height;
        frame.size.width -= fudgeFactor.width;
    
        NSMutableAttributedString* textToMeasure;
        if(internalTextView.attributedText && internalTextView.attributedText.length > 0){
            textToMeasure = [[NSMutableAttributedString alloc] initWithAttributedString:internalTextView.attributedText];
        }
        else{
            textToMeasure = [[NSMutableAttributedString alloc] initWithString:internalTextView.text];
            [textToMeasure addAttribute:NSFontAttributeName value:internalTextView.font range:NSMakeRange(0, textToMeasure.length)];
        }
    
        if ([textToMeasure.string hasSuffix:@"\n"])
        {
            [textToMeasure appendAttributedString:[[NSAttributedString alloc] initWithString:@"-" attributes:@{NSFontAttributeName: internalTextView.font}]];
        }
    
        //NSAttributedString class method: boundingRectWithSize:options:context is
        //available only on ios7.0 sdk.
        CGRect size = [textToMeasure boundingRectWithSize:CGSizeMake(CGRectGetWidth(frame), MAXFLOAT)
                                                  options:NSStringDrawingUsesLineFragmentOrigin
                                                  context:nil];
    
        return CGRectGetHeight(size) + fudgeFactor.height;
    }
    else
    {
        return self.internalTextView.contentSize.height;
    }
    }
    
  8. 1

    Si está utilizando iOS 7+, que sólo puede convertir en diseño automático, pin de cada uno de los lados de la vista de texto para el borde de su padre la vista, y funciona bien. Código adicional No es necesario.

  9. 0

    En iOS 8 que va de heredar algunos de los contenidos de desplazamiento de los padres, lo que usted necesita para deshacerse de así.

    Una subclase ejemplo

    //Originally from https://github.com/Nikita2k/resizableTextView
    
    #import "ResizableTextView.h"
    
    @implementation ResizableTextView
    
    - (void) updateConstraints {
    
        //calculate contentSize manually
        //ios7 doesn't calculate it before viewDidAppear and we'll get here before
        CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
    
        //set the height constraint to change textView height
        [self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
            if (constraint.firstAttribute == NSLayoutAttributeHeight) {
                constraint.constant = contentSize.height;
                *stop = YES;
            }
        }];
    
        [super updateConstraints];
    }
    
    - (void)setContentOffset:(CGPoint)contentOffset
    {
        //In iOS 8 we seem to be inheriting the content offset from the parent.
        //I'm not interested
    }
    
    @end
    
  10. 0

    En el guión gráfico, si el uso de restricciones, asegúrese de que están obligados a su superview en la ‘regla’ de la pestaña de la derecha del panel en xcode para la UITextView. Mi problema era que tenía una restricción de -80 pts sobre el ‘espacio al final’.

    ¿Cómo puedo tamaño de un UITextView a su contenido en iOS 7?

  11. 0

    Chicos el uso de autodiseño y su sizetofit no funciona, por favor revise su ancho de restricción una vez. Si has perdido el ancho de restricción, a continuación, la altura será preciso.

    Sin necesidad de utilizar ninguna de las otras API. sólo una línea se soluciona todo el problema.

    [_textView sizeToFit];
    

    Aquí, sólo estaba preocupado con la altura, manteniendo el ancho fijo y había perdido el ancho de la restricción de mi TextView en el guión gráfico.

    Y esto fue para mostrar el contenido dinámico de los servicios.

    Espero que esto pueda ayudar..

  12. 0

    Escribí una categoría más de UITextView:

    - (CGSize)intrinsicContentSize {
        return self.contentSize;
    }
    
    - (void)setContentSize:(CGSize)contentSize {
        [super setContentSize:contentSize];
        [self invalidateIntrinsicContentSize];
    }
    

    Cuando UIKit establece su contentSize, UITextView ajusta su intrinsic content size. Que juega muy bien con autolayout.

  13. 0

    La respuesta dada por bilobatum funcionó a la perfección Con el diseño auto, yo.e subclases de la textview.

    Si desea limitar la altura de la vista de texto agregar otra restricción (he añadido el uso de guión gráfico es decir, la altura de la <= 166 (altura como por su necesidad))

    A continuación, dentro de la subclase de reducir la prioridad de la altura de la restricción a 750 (auto.heightConstraint.prioridad = 750) para evitar el conflicto entre la altura de la restricción añadida en la subclase y la altura de la restricción añadida en el guión gráfico.

Dejar respuesta

Please enter your comment!
Please enter your name here