У мене є додаток, в якому я хочу змінитимоя висота комірки відповідно до вмісту отриманого рядка повідомлення. Я роблю так у методі делегування сторони hieghtforrow таблиці подання.
int rowHeight =0.0f;
UITableViewCell *cell = [ self.mtableview cellForRowAtIndexPath:indexPath.row];
CGSize size = [cell.textLabel.text sizeWithFont:[UIFont systemFontOfSize:13.0f] constrainedToSize:CGSizeMake(300, 5000) lineBreakMode:UILineBreakModeWordWrap];// calculate the height
rowHeight = size.height+10; // I use 10.0f pixel extra because depend on font
return rowHeight;
але це не дає збоїв у моїй програмі. Чи хтось може поглянути на це?
Відповіді:
1 для відповіді № 1Мені б хотілося бачити вашу cellForRowAtIndexPath
метод зрозуміти, як ви отримуєте текст для мітки.
Ви на правильному шляху з дзвінками sizeWithFont
але для успішного визначення цього вам потрібно дві речі:
- Розмір шрифту етикетки (який ви чітко зашифровані в 13,0)
- І текст для визначення розміру (який ви намагаєтеся витягнути з UILabel)
(Жорстко закодований розмір шрифту в коді на 13.0 не обов'язково є гарною ідеєю, тому що якщо ви хочете змінити його для комірки, вам потрібно запам'ятати, щоб змінити його по висотіForRowAtIndexPath і де б не було, але це вже інше питання).
Замість того, щоб витягувати текст для мітки з UILabel
Визначте текст із будь-якої структури даних, яка створила / містить текст в першу чергу. Ось чому бачити своє cellForRowAtIndexPath
метод був би корисним.
Не дзвони cellForRowAtIndexPath
від heightForRowAtIndexPath
або методи не призначені для використання таким чином.
Ось простий приклад, який я можу вдосконалити, коли ви публікуєте свою cellForRowAtIndexPath
код:
//ASSUME that self.arrayOfStrings is your data structure where you are retrieving the label"s text for each row.
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
int rowHeight =0.0f;
NSString *stringToSize = [self.arrayOfStrings objectAtIndexPath:indexPath.row];
CGSize size = [stringToSize sizeWithFont:[UIFont systemFontOfSize:13.0f] constrainedToSize:CGSizeMake(300, 5000) lineBreakMode:UILineBreakModeWordWrap];
rowHeight = size.height+10;
return rowHeight;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
cell.textLabel.text = [self.arrayOfStrings objectAtIndexPath:indexPath.row];
return cell;
}
0 для відповіді № 2
Видалити UITableViewCell *cell = [ self.mtableview cellForRowAtIndexPath:indexPath.row];
з вашого коду. Вам не потрібно додавати клітинку в метод HeightForRow.