Con este siguiente código, puede cambiar la altura de su UITextView dependiendo 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, tomará un NSAttributedString y un ancho fijo para devolver la altura necesaria.
Si desea calcular el marco a partir de un texto con una fuente específica, debe usar el siguiente código:
- (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 eso SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO
en su archivo prefix.pch en su proyecto como:
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
También puede reemplazar la prueba anterior SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)
por:
if ([text respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)])
NSStringDrawingUsesFontLeading
es extraEsto 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;
fuente
textView.bounds.size.height
En iOS7, se
UITextView
utilizaNSLayoutManager
para diseñar texto:// 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 arreglarcontentSize
:textView.layoutManager.allowsNonContiguousLayout = NO;
fuente
Usa esta pequeña función
-(CGSize) getContentSize:(UITextView*) myTextView{ return [myTextView sizeThatFits:CGSizeMake(myTextView.frame.size.width, FLT_MAX)]; }
fuente
Mi solución final se basa en HotJard, pero incluye inserciones superiores e inferiores del contenedor de texto en lugar de usar 2 * fabs (textView.contentInset.top):
- (CGFloat)textViewHeight:(UITextView *)textView { return ceilf([textView.layoutManager usedRectForTextContainer:textView.textContainer].size.height + textView.textContainerInset.top + textView.textContainerInset.bottom); }
fuente
Hay una solución más simple, usando 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 : funciona solo para mostrar texto (isEditable = NO)
fuente
usedRectForTextContainer
devuelve la misma altura._textView.textContainerInset = UIEdgeInsetsZero; _textView.textContainer.lineFragmentPadding = 0;
Simplemente no olvides el lineFragmentPadding
fuente
solución simple:
textView.isScrollEnabled = false
funciona perfectamente cuando está dentro de otra vista de desplazamiento o celda de tableView conUITableViewAutomaticDimension
fuente
@ Ana's, la solución de @Blake Hamilton en rápida .
var contentHeight: CGFloat = textView.sizeThatFits(textView.frame.size).height
Lo bueno para mí fue que esto también devuelve el correcto
contentSize
, cuandoisScrollEnable
se establece en falso. La configuración en falso devolvió el tamaño del marco de la vista de texto en lugar del tamaño del contenido.fuente