Cómo hacer que un UITextView se ajuste automáticamente en un UITableViewCell
-
05-07-2019 - |
Pregunta
Configuración: Tengo un UITextView
dentro de un UITableViewCell
del contentView
. Quiero que ocupe el tamaño completo de la celda. Creo la vista de texto de esta manera:
UITextView *textView = [[[UITextView alloc] initWithFrame:CGRectMake(0,0,268,43)] autorelease];
textView.backgroundColor = [UIColor redColor];
textView.layer.cornerRadius = 10;
textView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
Y anulo heightForRowAtIndexPath para devolver 200 para esa fila.
El color de fondo es solo para que pueda decir dónde está. La celda parece dimensionarla automáticamente correctamente en la primera vista. Sin embargo, lo necesito para seguir redimensionándolo correctamente mientras se ejecuta automáticamente la interfaz, lo que parece funcionar solo algunas veces, y solo cuando no estoy editando textView. Otras veces, cambia el tamaño de la vista para que tenga una altura muy pequeña (se ve como -1), o la amplía demasiado o simplemente no la cambia de tamaño.
He intentado sobrescribir layoutSubviews en la celda y simplemente no hacer nada, pero incluso eso no impide que la vista cambie de tamaño en todo el lugar.
He estado hackeando esto por un tiempo, pero todavía no he encontrado ninguna solución.
Solución
Un UITableViewCell tiene una altura fija, la altura proporcionada por el delegado de UITableView. Cuando gire su dispositivo, la altura de la fila nunca cambiará, a menos que llame a -reloadData
en su tableView. Me desharé de los autoresizing y los administraré usted mismo.
Cuando inicia su textField, puede configurar fácilmente el marco en CGRectZero
. Luego implemente -layoutSubviews
(y llame a super en ese método, antes configurando los marcos de sus subvistas) y configure el marco de UITextField de acuerdo con el contenido contentRect propiedad de la célula.
- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier {
if(self = [super ...]){ // or -initWithStyle:reuseIdentifier: whatever you want
_textView = [[UITextView alloc] initWithFrame:CGRectZero]; // Instance variable
// Probably not needed to set autoresizing mask
}
return self;
}
- (void)layoutSubviews {
[super layoutSubviews];
_textView.frame = CGRectMake(0.0f, 0.0f, self.contentRect.size.width, self.contentRect.size.height); // Adjust as needed
}