Изменить: tl; dr: Могу ли я заставить detailTextLabel обновлять свой размер с помощью системы автоматического макета в iOS при изменении значения?
Edit2: У меня есть частичное решение, но продолжу поиск лучшего. См. Ниже.
У кого-нибудь еще были проблемы с меткой detailText в UITableViewCell с iOS 8?
У меня есть таблица, которая содержит как текстовые, так и подробные строки. Первоначально подробный текст представляет собой пустую строку (@""). После выполнения сериала раскадровки на экране редактирования я возвращаюсь с новым значением для подробного текста и обновляю его. Я пытаюсь перезагрузить таблицу в viewWillAppear, чтобы значение было сразу же после возврата к предыдущему виду.
Когда вид таблицы снова виден, ячейка таблицы сдвинула текстовое поле вверх, чтобы освободить место для подробного текста, но не отображается подробный текст. Текст не отображается, пока я не вернусь на экран редактирования и не вернусь второй раз.
Что я сделал для устранения неполадок: Похоже, что макет автоматической компоновки для текстовой метки детали не корректно обновляется, как я думаю, и должен регистрировать размер и состав detailTextLabel кадр подтверждает это.
Я могу заставить текст обновить, запустив [table reloadData] в viewDidAppear, однако это оставляет меня с мерцающим эффектом, который мне не нравится, и выглядит непрофессиональным.
Изменить: дополнительные действия, которые я сделал: я также заставил detailTextLabel перестраивать себя, используя [cell.detailTextLabel sizeToFit]. Это заставляет его отображать, но смещается в ячейке нечетным образом. После того, как вы снова перейдете на страницу редактирования, detailTextLabel зафиксирует ее положение.
Я создал простой проект как репозиторий github, чтобы точно показать, что я имею в виду:
https://github.com/acidaris/ios8_table_issue
Основной код контроллера просмотра, который я использую, также находится ниже.
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.table reloadData];
}
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section {
return 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier"];
cell.textLabel.text = @"This is a test";
cell.detailTextLabel.text = self.value;
CGRect frame = cell.detailTextLabel.frame;
NSLog(@"detailTextLabel x=%f y=%f width=%f height=%f",
frame.origin.x,frame.origin.y,frame.size.width,frame.size.height);
return cell;
}
Ячейка прототипирована в StoryBoard, и поэтому ячейка, выбранная dequeueReusableCellWithIdentifier: всегда определяется. Кроме того, тип ячейки в раскадровке установлен на субтитры, и он отображает, если определено начальное значение.
Если бы кто-нибудь мог помочь мне понять это, я был бы невероятно благодарен.
Частичное решение
Если вы подклассифицируете UITableViewCell, вы можете изменить кадр для detailTextLabel, когда макет будет выполнен. Это то, что я сделал, и, похоже, сработал, , но на 6 плюс я получаю странную разделительную линию между textLabel и detailTextLabel. edit: (Я скорректировал это. ) Мне не нравится это решение, но пока это лучшее, что я встретил. Он не обновляется после представления представления и относительно прост. Как я сказал выше, я продолжу искать лучшее решение.
- (void)layoutSubviews {
[super layoutSubviews];
CGRect textFrame = self.textLabel.frame;
[self.detailTextLabel sizeToFit];
CGFloat x = textFrame.origin.x;
CGFloat y = textFrame.origin.y + textFrame.size.height;
CGSize detailSize = self.detailTextLabel.frame.size;
CGRect newFrame = CGRectMake(x, y, detailSize.width, detailSize.height);
self.detailTextLabel.frame = newFrame;
}
Я также обновил свой проект Github, чтобы отразить свое текущее решение. Edit3: Это не работает отлично, поскольку у него неправильные значения для действительно автоматических макетов, но он работает для моих целей на данный момент.
Изменить 4: я обновил функцию layoutSubviews, чтобы сделать ее более умной. Он будет иметь размер, чтобы зафиксировать содержимое в метке и поместить метку соответствующим образом в координатах x/y относительно текстовой метки.