UITableViewAutomaticDimension no funciona para pie de página en iOS8

Tengo un pie de página en UITableView . El pie de página solo contiene una UILabel y quiero ajustar la altura del pie de página depende de UILabel así que tengo que usar

 self.tableview.estimatedSectionFooterHeight = 140; self.tableview.sectionFooterHeight = UITableViewAutomaticDimension; 

Funciona bien en iOS9, pero no funciona en iOS8. introduzca la descripción de la imagen aquí

Aquí está mi vista de pie de página introduzca la descripción de la imagen aquí El UILabel tiene restricciones: top=5, leading/trailing=8, bottom=34, line=0, height >= 18

Aquí está mi código para pie de página de inicio

 - (UIView *) tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{ NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"BaseFooterViewCell" owner:self options:nil]; BaseFooterViewCell *myFooterView = [nibViews objectAtIndex: 0]; myFooterView.contentLabel.text = @"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book."; return myFooterView; } 

¿Cómo puedo hacer que funcione en iOS8? Cualquier ayuda o sugerencia sería muy apreciada.
Si no puede comprender mi problema, consulte el PROYECTO DEMO

ACTUALIZACIÓN En algunos casos, mi pie de página será más complejo, no solo contiene una UILabel , y también UILabel , UIButton tendrá un tamaño diferente para iPhone e iPad . Por lo tanto, es muy difícil calcular correctamente la altura del pie de página. Todavía quiero usar UITableViewAutomaticDimension

Puedes usar esto,

 -(CGFloat)tableView:(UITableView*)tableView heightForFooterInSection:(NSInteger)section{ // return 43; CGSize constraint = CGSizeMake(width, 20000.0f); CGSize size; CGSize boundingBox = [text boundingRectWithSize:constraint options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil].size; size = CGSizeMake(ceil(boundingBox.width), ceil(boundingBox.height)); return size.height; } 

Inténtalo, es trabajo para mí o siéntete libre.

Bueno, esto parece extraño. Tu código es correcto y has establecido tus restricciones perfectamente.

¿Ha configurado la label de su footerView con el número de líneas a 0? Vuelva a cargar la vista si aún persiste el problema.

Entonces, esto funcionó calculando la altura en function del text de manera programática:

 #import "ViewController.h" #import "BaseFooterViewCell.h" @interface ViewController ()<UITableViewDelegate,UITableViewDataSource> @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.tableview.delegate = self; self.tableview.dataSource = self; // Comment these out so that the table will call #heightForFooterInSection // self.tableview.estimatedSectionFooterHeight = 140; // // self.tableview.sectionFooterHeight = UITableViewAutomaticDimension; } -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ return 1; } - (UIView *) tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{ //Gett the cell text content NSString* textForCell = @"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book."; NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"BaseFooterViewCell" owner:self options:nil]; BaseFooterViewCell *myFooterView = [nibViews objectAtIndex: 0]; myFooterView.contentLabel.text = textForCell; // Set the height constraint as an outlet in the cell's class so that you can adjust it to set the // right size. Also, The -16 in the andMaxWidth param is to account for the leading/trailing width on the label myFooterView.cellLabelHeightConstraint.constant = [self heightForString:textForCell withFont:[UIFont systemFontOfSize:15.0] andMaxWidth:self.view.frame.size.width - 16]; [myFooterView layoutIfNeeded]; [tableView layoutIfNeeded]; return myFooterView; } -(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { //this would be just getting the content for the label and calling the heightForString Method NSString* textForCell = @"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book."; // the +39 at the end of the return is to account for the 34point bottom space and the 5point // top space on the label return [self heightForString:textForCell withFont:[UIFont systemFontOfSize:15.0] andMaxWidth:self.view.frame.size.width - 16] + 39; } -(CGFloat) heightForString:(NSString*)string withFont:(UIFont*)font andMaxWidth:(CGFloat)width { CGRect rect = [string boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: font} context:nil]; CGFloat height = ceilf(rect.size.height); return height; } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return 3; } -(UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *simpleTableIdentifier = @"SimpleTableItem"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier]; } cell.textLabel.text = @"aA"; return cell; } @end 

Y su BaseFooterViewCell.h con la salida agregada

 #import <UIKit/UIKit.h> @interface BaseFooterViewCell : UIView @property (weak, nonatomic) IBOutlet NSLayoutConstraint *cellLabelHeightConstraint; @property (weak, nonatomic) IBOutlet UILabel *contentLabel; @end 

y el código cambiado y se downloadá de aquí: descarga de Dropbox del código cambiado

Y solo una nota al margen: si en su proyecto actual no usa la fuente del sistema y está utilizando una fuente personalizada o una fuente alternativa, etc … tendrá que hacer ese cambio en las llamadas al método heightForString

Resultado de mis cambios en el simulador ios 8.1

Las restricciones de layout del pie de página son correctas y creo que no puede usar UITableViewAutomaticDimension para pie de página en iOS 8.

Para iOS8, debe calcular la altura del pie de página mediante progtwigción y no establecer estimatedSectionFooterHeigh o establecer estimatedSectionFooterHeight = 0

Para iOS9 y superior puede usar UITableViewAutomaticDimension normalmente. Por favor, consulte esta reference: https://github.com/ebetabox/DynamicCellSectionHeight

Después de la testing, aquí están mis resultados

Para iOS8, UITableViewAutomaticDimension solo funciona para el encabezado de sección y la celda de vista de tabla y no funciona para el pie de página de sección

PERO extrañamente, si mi vista de tabla usa tanto encabezado de sección como pie de página, UITableViewAutomaticDimension funcionará para pie de página.

Entonces aquí está la solución

 - (void)viewDidLoad { // I set UITableViewAutomaticDimension for both footer and header self.tableview.estimatedSectionHeaderHeight = 0; // it should be 0 because header is empty self.tableview.sectionHeaderHeight = UITableViewAutomaticDimension; self.tableview.estimatedSectionFooterHeight = 140; self.tableview.sectionFooterHeight = UITableViewAutomaticDimension; } // I return empty view for header - (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{ return [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)]; } 

Para iOS9 y superior, UITableViewAutomaticDimension funciona correctamente

introduzca la descripción de la imagen aquí

Necesita establecerlo en IB o en código y eliminar la restricción de altura

 [yourLabel setContentCompressionResistancePriority:UILayoutPriorityRequinetworking forAxis:UILayoutConstraintAxisHorizontal]; [yourLabel setContentHuggingPriority:UILayoutPriorityRequinetworking forAxis:UILayoutConstraintAxisHorizontal]; 

Y después de configurar el text, llame a esto

 [self setNeedsDisplay]; [self layoutIfNeeded]; 

en la class BaseFooterViewCell

Espero que esto ayude. Tomé esto del ejemplo de autoimage de Apple

Simplemente dé cuatro limitaciones a la label: Top,leading,trailing and bottom . No le dé restricciones de altura.

Y en viewWillAppear o viewDidAppear recargar inputViews of footeView algo como,

  [self.tableView.tableFooterView reloadInputViews]; 

Actualizar:

Intente implementar heightForFooterInSection como,

 -(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{ return UITableViewAutomaticDimension; } 

Lo primero que quiero decir es "El valor mágico que usaste 140 es realmente muy cercano para este text rect". Cambie este valor y verá que no funciona en iOS 9 también. Y elimine esa restricción de altura de la label y luego compruebe que no está funcionando en ambas versiones de IOS. Esta restricción de altura está metiéndose un poco en IOS 8. Y esa es una altura> = restricción, probablemente IOS tenga un error.

Ahora hay alguna aclaración para sectionFooterHeight un estimado de SectionFooterHeight . Esta secciónFooterHeight jus proporciona un valor estático a IOS que utiliza para dimensionar el pie de página. estimatedSectionFooterHeight simplemente mejora el performance, por ejemplo, la altura estimada debería estar cerca de la altura real, por lo que IOS no tiene que volver a dibujar una vista enorme. (Lo entiendo para el documento oficial

Y el rest es que debe calcular el tamaño de la label en time de ejecución. Entonces, cree una vista de pie de página apropiada y devuélvala.