UITableViewAutomaticDimension не работает для нижнего колонтитула в iOS8

У меня есть нижний колонтитул в UITableView . UILabel колонтитул только содержит UILabel и я хочу, чтобы высота UILabel колонтитула зависела от UILabel поэтому я использую

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

Он хорошо работает на iOS9, но не работает в iOS8 введите описание изображения здесь

Вот мой нижний колонтитул введите описание изображения здесь UILabel имеет ограничения: top=5, leading/trailing=8, bottom=34, line=0, height >= 18 UILabel top=5, leading/trailing=8, bottom=34, line=0, height >= 18

Вот мой код для нижнего колонтитула init

 - (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; } 

Как я могу заставить его работать в iOS8? Любая помощь или предложение были бы очень оценены.
Если вы не можете понять мою проблему, проверьте DEMO PROJECT

ОБНОВЛЕНИЕ В некоторых случаях мой нижний колонтитул будет более сложным, он содержит не только один UILabel , но и UILabel , UIButton будет иметь разный размер для iPhone и iPad . Поэтому очень сложно правильно вычислить высоту нижнего колонтитула. Я все еще хочу использовать UITableViewAutomaticDimension

8 Solutions collect form web for “UITableViewAutomaticDimension не работает для нижнего колонтитула в iOS8”

Вы можете использовать это –

 -(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; } 

Пожалуйста, попробуйте, это работа для меня или не стесняйтесь.

Ну, это кажется странным. Ваш код верен, и вы отлично установили свои ограничения.

Установили ли вы метку вашего footerView с числом строк до 0? Перезагрузите представление, если проблема все еще сохраняется.

Поэтому я получил это, чтобы работать, вычисляя высоту, основанную на тексте, программно:

 #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 

И ваш BaseFooterViewCell.h с добавленным выходом

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

и измененный код и загружаться отсюда: Dropbox загрузка измененного кода

И просто примечание: если в вашем фактическом проекте вы не используете системный шрифт, и используете пользовательский шрифт или альтернативный шрифт и т. Д., Вам нужно будет внести это изменение в вызовы метода heightForString

Результат моих изменений на симуляторе ios 8.1

Ограничения макета нижнего колонтитула верны, и я думаю, что вы не можете использовать UITableViewAutomaticDimension для UITableViewAutomaticDimension колонтитула в iOS 8.

Для iOS8 вы должны программно вычислять высоту нижнего колонтитула и не устанавливать оценочную функциюSectionFooterHeigh или задавать estimatedSectionFooterHeight = 0

Для iOS9 и выше вы можете использовать UITableViewAutomaticDimension обычно. Пожалуйста, проверьте это: https://github.com/ebetabox/DynamicCellSectionHeight

После теста, вот мои результаты

Для iOS8 UITableViewAutomaticDimension работает только для заголовка раздела и таблицы viewview и не работает для нижнего колонтитула раздела

НО странно, если мой табличный вид использует заголовок и нижний колонтитул раздела, UITableViewAutomaticDimension будет работать для нижнего колонтитула.

Тогда вот решение

 - (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)]; } 

Для iOS9 и выше UITableViewAutomaticDimension работает правильно

введите описание изображения здесь

Вам нужно установить в IB или в коде и удалить ограничение по высоте

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

И после установки текстового вызова

 [self setNeedsDisplay]; [self layoutIfNeeded]; 

в классе BaseFooterViewCell

Надеюсь, эта помощь. Я взял это из примера Self Sizing от Apple

Просто дайте четыре ограничения для обозначения: Top,leading,trailing and bottom . Не указывайте ограничение по высоте.

И в viewWillAppear или viewDidAppear перезагрузите inputViews footeView что-то вроде,

  [self.tableView.tableFooterView reloadInputViews]; 

Обновить:

Попробуйте реализовать heightForFooterInSection например,

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

Первая вещь, которую я хочу сказать, – «Магическое значение, которое вы использовали 140, на самом деле очень близко для этого текста rect». Измените это значение, и вы обнаружите, что оно не работает на iOS 9. И удалите ограничение по высоте с метки, а затем проверьте, не работает ли она на обеих версиях IOS. Это ограничение высоты немного путается в IOS 8. И thats height> = constraint, вероятно, у IOS есть ошибка.

Теперь некоторые пояснения для sectionFooterHeight оцененыSectionFooterHeight . Этот разделFooterHeight jus дает статическое значение IOS, которое оно использует для определения нижнего колонтитула. оценкамSectionFooterHeight просто улучшает производительность, например, предполагаемая высота должна быть близка к фактической высоте. Поэтому IOS не нужно перерисовывать огромное представление. (Мое понимание для официального документа

Остальное – вы должны вычислить размер метки во время выполнения. Затем создайте соответствующий нижний колонтитул и верните его.

  • Создание настраиваемого UITableView
  • Выпадающий список в UITableView в iOS
  • dequeueReusableCellWithIdentifier всегда возвращает nil (не используя раскадровку)
  • Прокрутка для удаления опции в проблемах UITableView
  • Пользовательский UITableViewCell в режиме редактирования не перемещает мои UILabels
  • Обновить ограничения других элементов при изменении высоты UITableView
  • Как получить значение (метку) из TextField внутри пользовательской ячейки таблицы View to post on te URL
  • Как я могу перерабатывать объекты UITableViewCell, созданные из XIB?
  • Пример UITableView для Swift
  • swift ios добавляет бесконечную прокрутку прокрутки в uitableview
  • Верхние строки исчезают из UITableView при reloadData (), пока не будут прокручиваться вверх / вниз
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.