Estoy de portar una de las apps de iOS 6.1 para iOS 7. Estoy usando un diseño donde hay una UITextView que tiene un ancho de la revisión, pero la altura se basa en su contentsize. Para iOS 6.1 comprobación de la contentsize.altura y estableciendo como textview del marco altura era suficiente, pero no funciona en iOS 7.

Cómo puedo crear un UITextView con un ancho fijo, pero dinámico de altura sobre la base del texto es mostrar?

NOTA: estoy creando estas vistas desde el código, no con Interface Builder.

9 Comentarios

  1. 179

    Con este código siguiente, usted puede cambiar la altura de su UITextView en función de un ancho fijo (funciona en iOS 7 y la versión anterior) :

    - (CGFloat)textViewHeightForAttributedText:(NSAttributedString *)text andWidth:(CGFloat)width
    {
        UITextView *textView = [[UITextView alloc] init];
        [textView setAttributedText:text];
        CGSize size = [textView sizeThatFits:CGSizeMake(width, FLT_MAX)];
        return size.height;
    }

    Con esta función, usted va a tomar una NSAttributedString y un ancho fijo para devolver la altura necesaria.

    Si quieres calcular el marco de un texto con una fuente específica que usted, deberá utilizar el código siguiente :

    - (CGSize)text:(NSString *)text sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size
    {
        if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
        {
            CGRect frame = [text boundingRectWithSize:size
                                              options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)
                                           attributes:@{NSFontAttributeName:font}
                                              context:nil];
            return frame.size;
        }
        else
        {
            return [text sizeWithFont:font constrainedToSize:size];
        }
    }

    Puede agregar que SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO en su prefijo.archivo pch en el proyecto como:

    #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

    También puede sustituir a la anterior prueba SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) por :

    if ([text respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)])‌
    • sólo puedo darle a usted después de 24 horas. ser paciente, es tuyo 🙂
    • Tal vez usted debería vincular a las respuestas que les llevó de? stackoverflow.com/questions/18368567/…
    • Montel, para otra pregunta, si me he fijado la anchura y la altura , ¿cómo puedo encontrar el mejor tamaño de la fuente para que se le asigna una cadena? tengo el problema similar en iOS7 (en iOS6, yo puedo hacer eso)
    • ensayo y error; aumentar o disminuir el tamaño en 1 hasta que sus calcula la altura es demasiado grande. O hacer que el tamaño de 1000 y de cambio de tamaño automático para el ajuste.
    • Probado con iOS7. Funciona! Impresionante.
    • esta respuesta YA está INCORRECTA. Tratar a la entrada de una gran cantidad de texto en el interior de dicho campo de texto. De repente tamaño incorrecto? Al menos NSStringDrawingUsesFontLeading es extra
    • (NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading) me ayuda mucho.

  2. 42

    Esto funcionó para mí para iOS6 y 7:

    CGSize textViewSize = [self.myTextView sizeThatFits:CGSizeMake(self.myTextView.frame.size.width, FLT_MAX)];
        self.myTextView.height = textViewSize.height;
    • Hola, si su woking para mí… estoy acostumbrado «txtviewHeight.marco.tamaño.altura» en lugar de «txtviewHeight.contentSize.la altura»
    • oh.. super fácil!
    • ¿por qué estoy recibiendo propiedad de la altura no se encuentra en el objeto de tipo «UITextView» ?
    • @Hexark textView.bounds.size.height
  3. 20

    En iOS7, UITextView utiliza NSLayoutManager para el texto de la presentación:

    //If YES, then the layout manager may perform glyph generation and layout for a given portion of the text, without having glyphs or layout for preceding portions.  The default is NO.  Turning this setting on will significantly alter which portions of the text will have glyph generation or layout performed when a given generation-causing method is invoked.  It also gives significant performance benefits, especially for large documents.
    @property(NS_NONATOMIC_IOSONLY) BOOL allowsNonContiguousLayout;

    deshabilitar allowsNonContiguousLayout para solucionar contentSize :

    textView.layoutManager.allowsNonContiguousLayout = NO;
    • Su respuesta no se ajuste a la pregunta, sino que se adapte a mi problema. Así que yo voto a favor 🙂
    • Esto no corrige el tamaño del contenido para mí. Está desactivado el desplazamiento.
    • Este trozo de código solucionado mi problema, pero ¿en qué generación que causan método de la media en la que comentas?
  4. 15

    Utilizar esta función poco

    -(CGSize) getContentSize:(UITextView*) myTextView{
        return [myTextView sizeThatFits:CGSizeMake(myTextView.frame.size.width, FLT_MAX)];
    }
    • Trabaja en iOS6 y iOS7 para mí. Gracias!
  5. 3

    Mi solución final se basa en HotJard, sino que incluye tanto la parte superior e inferior de las inserciones de contenedor de texto en vez de usar 2*fabs(textView.contentInset.la parte superior) :

    - (CGFloat)textViewHeight:(UITextView *)textView
    {
        return ceilf([textView.layoutManager usedRectForTextContainer:textView.textContainer].size.height +
                     textView.textContainerInset.top +
                     textView.textContainerInset.bottom);
    }
  6. 2

    Hay solución más simple, el uso de este método:

    +(void)adjustTextViewHeightToContent:(UITextView *)textView;
    {
        if([[UIDevice currentDevice].systemVersion floatValue] >= 7.0f){
            textView.height = [textView.layoutManager usedRectForTextContainer:textView.textContainer].size.height+2*fabs(textView.contentInset.top);
        }else{
            textView.height = textView.contentSize.height;
        }
    }

    UPD: trabajar sólo para la visualización de texto (isEditable = NO)

    • Parece que su solition no funciona. Cuando textview pasar a segunda línea usedRectForTextContainer método devuelve a la misma altura.
    • Ah, puede ser, yo v para mostrar el texto
  7. 1
       _textView.textContainerInset = UIEdgeInsetsZero;
       _textView.textContainer.lineFragmentPadding = 0;

    Pero no hay que olvidar la lineFragmentPadding

  8. 0

    solución simple – textView.isScrollEnabled = false
    funciona perfecto, cuando dentro de otro, el desplazamiento de la vista, o en formato tableview celular con UITableViewAutomaticDimension

  9. 0

    @Ana, @Blake Hamilton solución en swift.

    var contentHeight: CGFloat = textView.sizeThatFits(textView.frame.size).height

    Lo bueno para mí es que este también devuelve el correcto contentSize, cuando isScrollEnable se establece en false. Parámetro a false, devuelve la vista de texto del tamaño de los fotogramas en lugar de que el tamaño del contenido.

Dejar respuesta

Please enter your comment!
Please enter your name here