Я строю таблицу, которая показывает запись для пользователя. Одна из ячеек отображает набор «тегов», загруженных с сервера. В настоящее время я создаю набор UILabels и вручную добавляю их в представление, содержащееся в ячейке. Хотя это работает, ячейка не динамически изменяет размер после добавления тегов. Теги перекрывают ячейку под ней, и я не могу понять, как вручную обновлять высоту ячейки.Обновление высоты UITableViewCell
В cellForRowAtIndexPath:
JournalTagsCell *cell = [tableView dequeueReusableCellWithIdentifier:@"JournalTagsCell" forIndexPath:indexPath];
//Check if we have any tags to show
if(self.journalObject.journalEntryTags != nil){
cell.placeholderLabel.hidden = YES;
cell.tagsView = [self updateTagsView:cell.tagsView];
}
return cell;
Ниже мой метод для фактического создания каждого тега, закладывая их и добавляя их к виду:
- (void)updateTagsView:(UIView*)viewToUpdate{
NSArray *items = self.journalObject.journalEntryTags;
//Clean up the view first
NSArray *viewsToRemove = [viewToUpdate subviews];
for (UIView *v in viewsToRemove) {
[v removeFromSuperview];
}
float x = 10;
float y = 10;
for (int i = 0; i < items.count; i++) {
CGRect textRect = [items[i] boundingRectWithSize:CGSizeMake(self.view.frame.size.width - 20, 1000)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:[UIFont tagCopy]}
context:nil];
CGSize size = textRect.size;
if (x+size.width > (self.view.frame.size.width-20)) {
y += size.height + 10;
x = 10;
}
UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(x, y, size.width, size.height)];
lbl.userInteractionEnabled = YES;
[lbl setText:[NSString stringWithFormat:@" %@ ", items[i]]];
[lbl setFont:[UIFont tagCopy]];
[lbl sizeToFit];
[lbl setTextColor:[UIColor colorWithRed:0.145 green:0.392 blue:0.576 alpha:1.000]];
[lbl setBackgroundColor:[UIColor colorWithRed:0.804 green:0.871 blue:0.914 alpha:1.000]];
lbl.layer.borderWidth = 1;
lbl.layer.borderColor = [UIColor colorWithRed:0.145 green:0.392 blue:0.576 alpha:1.000].CGColor;
lbl.layer.cornerRadius = 5;
[lbl.layer setMasksToBounds:YES];
[viewToUpdate addSubview:lbl];
UITapGestureRecognizer *tapGesture =
[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userClickedOnTag:)];
[lbl addGestureRecognizer:tapGesture];
x += size.width + 10;
if (x > (self.view.frame.size.width-20)) {
y += size.height + 10;
x = 10;
}
if (i == items.count-1) {
y+= size.height + 20;
}
}
[viewToUpdate setFrame:CGRectMake(0, 0, self.view.frame.size.width, y)];
}
Однако, я не знаю, как вручную обновить высоту для этой ячейки на основе размера этого представления. Я не хочу/нужно вручную вычислять высоту каждой отдельной ячейки, именно это я и не использую в настоящее время heightForRowAtIndexPath, но я не знаю, как обновить высоту этой одной ячейки. Очевидно, я могу вычислить высоту, которая мне нужна для этой ячейки, если это необходимо, поскольку я уже настраиваю рамку представления, которая содержит теги, но не нужно проходить через каждую ячейку и вручную вычислять каждую высоту, я в тупике.
использовать автомат, вывести этот вид на четыре угла в ячейки – Dev
Под автозагрузкой iOS 8 можно автоматически обеспечить высоту ячейки для TableView. Но это работает, только если вы используете ограничения; если вы добавляете subview программно, вам также необходимо будет добавлять ограничения программно. –