Tamaño de contenido de UITextView diferente en iOS7

Estoy usando una UITextView que será expandible al grabar un button "más". El problema es el siguiente:

En iOS6 uso esto,

 self.DescriptionTextView.text = @"loong string"; if(self.DescriptionTextView.contentSize.height>self.DescriptionTextView.frame.size.height) { //set up the more button } 

El problema es que en iOS7, contentSize.height devuelve un valor diferente (mucho más pequeño) que el valor que devuelve en iOS6. ¿Por qué es esto? ¿Como arreglarlo?

La propiedad de tamaño de contenido ya no funciona como lo hizo en iOS 6. Usar sizeToFit como otros sugieren puede o no funcionar dependiendo de una serie de factores.

No funcionó para mí, así que uso esto en su lugar:

 - (CGFloat)measureHeightOfUITextView:(UITextView *)textView { if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) { // 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 measunetworkingHeight = ceilf(CGRectGetHeight(size) + topBottomPadding); return measunetworkingHeight; } else { return textView.contentSize.height; } } 

Pruebe la respuesta en el siguiente enlace, se debe llamar a layoutIfNeeded antes de contentSize .

iOS7 UITextView contentsize.height alternativa

La respuesta:

En iOS7, UITextView usa NSLayoutManager para NSLayoutManager text:

 // 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; 

deshabilita allowsNonContiguousLayout para corregir contentSize :

 textView.layoutManager.allowsNonContiguousLayout = NO; 

Este enlace parece tener la respuesta.

Debe usar sizeToFit antes de usar contentSize .

Intente con el siguiente código, funcionará en iOS6 y 7, inténtelo.

 CGSize myTextViewSize = [self.myTextView sizeThatFits:CGSizeMake(self.myTextView.frame.size.width, FLT_MAX)]; self.myTextView.height = myTextViewSize.height; NSLog(@"%f", self.myTextView.height);