Динамический размер многострочного UILabel и сопровождающая ячейка просмотра таблицы программно
Я борюсь с тем, как динамически изменить размер uilabel внутри uitableviewcell, а также отрегулировать высоту ячейки таблицы в зависимости от текста, который я поместил в метку. Я хочу, чтобы строка целиком отображалась в ячейке таблицы, всегда с одинаковым размером шрифта для всех ячеек. Это кажется довольно стандартным, но я замечаю много дискуссий / дебатов / недовольства по поводу переполнения стека. Я начал с этих сообщений:
Изменение размера пользовательской ячейки с использованием UILabel на основе текста содержимого из файла JSON (ответ @Seya) boundingRectWithSize для NSAttributedString, возвращающего неправильный размер (ответ @JOM)
Функции, которые я пытаюсь использовать, являются копиями того, что сделал Сейя, почти без изменений. Тем не менее, я вижу, что хотя функция печатает разные высоты для разных ячеек, все, что я вижу, это 1 строка текста на ярлык, хотя они должны показывать много строк. Кроме того, странно, что текст из одной ячейки, кажется, отображается поверх другой ячейки - не уверен, связано ли это.
Мои 2 вопроса: (1) Почему я вижу только первую строку текста? (2) Почему UILabel/ ячейка не изменяет размеры в зависимости от высоты, которую я вижу напечатанной в журнале (или они изменяют размеры, но маскируются проблемой № 1)?
Вот три функции, которые я использую (они вместе с XIB - может ли XIB быть проблемой?):
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
JudgeCell *cell = [tableView dequeueReusableCellWithIdentifier:@"JudgeCell"];
if(!cell)
{
[tableView registerNib:[UINib nibWithNibName:@"JudgeCell" bundle:nil] forCellReuseIdentifier:@"JudgeCell"];
cell = [tableView dequeueReusableCellWithIdentifier:@"JudgeCell"];
}
cell.username.text = self.object.answerUser[indexPath.row];
cell.answer.text = self.object.answerArray[indexPath.row];
NSString *text = cell.answer.text;
CGSize constraint = CGSizeMake(50, 20000.0f);
CGSize size = [self frameForText:text sizeWithFont:[UIFont systemFontOfSize:15] constrainedToSize:constraint];
cell.username.frame = CGRectMake(10, 10, 50, size.height); //MAX(size.height, 14.0f));
return cell;
}
-(CGSize)frameForText:(NSString*)text sizeWithFont:(UIFont*)font constrainedToSize:(CGSize)size {
NSMutableParagraphStyle * paragraphStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];
paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping;
NSDictionary * attributes = @{NSFontAttributeName:font,
NSParagraphStyleAttributeName:paragraphStyle
};
CGRect textRect = [text boundingRectWithSize:size
options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
attributes:attributes
context:nil];
NSLog(@"size is %f ", textRect.size.height);
return textRect.size;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
NSString *text = self.object.answerArray[indexPath.row];
CGSize constraint = CGSizeMake(50, 20000.0f);
CGSize size = [self frameForText:text sizeWithFont:[UIFont systemFontOfSize:15] constrainedToSize:constraint];
CGFloat height = size.height; //MAX(size.height, 14.0f);
NSLog(@"size is %f AT INDEX %d", height, indexPath.row);
return height + 20;
}
Спасибо за любой совет!
1 ответ
В конце концов я удалил свой связанный с ним файл пера, и каким-то образом это, похоже, помогло с кодом из этого урока (что похоже на то, что я уже опубликовал выше):
http://www.cimgf.com/2009/09/23/uitableviewcell-dynamic-height/
Обратите внимание, что методы в руководстве иногда помечаются как устаревшие. Если я найду обновленный учебник, я опубликую.