2015-03-17 2 views
4

Я использую autoLayout для моего customCell в xib, потому что я хочу иметь переменную высоту для строк на основе текста.UITableView отскакивает с оценкой RowHeight

Сейчас в моем VC.m

Я использую эти строки кода

- (void)viewdidLoad 
{ 
    m_tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];  
    m_tableView.estimatedRowHeight = 97.0; 
    m_tableView.rowHeight = UITableViewAutomaticDimension; 
} 

вот моя cellForRow функция

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    CustomCell *tableCell = (NotesCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (tableCell == nil) { 

     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil]; 
     tableCell = [nib objectAtIndex:0]; 
    }  
    // Configure the cell... 


    //This code is used to make the separator full width. Also the tableview separator insets should be set to zero 

    tableCell.layoutMargins = UIEdgeInsetsZero; 
    tableCell.preservesSuperviewLayoutMargins = NO; 

    return tableCell; 
} 

Так что теперь, когда я обновляю строку я называю эти строки кода

[m_tableView beginUpdates]; 
    [m_tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:m_indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    [m_tableView endUpdates]; 

Когда я это делаю, Tableview просто отскакивает. Я не знаю, что происходит не так

С уважением Ранджит

+0

Любые удачи на этом? –

ответ

0

Вы должны использовать dequeueReusableCellWithIdentifier:forIndexPath вместо версии, которую вы используете.

Тот, который вы используете, не будет иметь размерного класса из-за того, что возвращенная ячейка не имеет родителя. Это проблема, которая появляется из xcode 6 и выше из-за изменения класса размера.

Попытайтесь изменить эту версию, которая возвращает ячейку, которая является частью таблицы, и, таким образом, наследует traitCollection супервизоров и помогает макету работать правильно.

+0

Здравствуйте, я попробовал ваше предложение, но не повезло. tableview все еще отскакивает – Ranjit

+0

Если вы просто вызываете '[m_tableView reloadData]', а не 'reloadRowsAtIndexPath', как тест, он отказывается? –

+0

И где вы вызываете перезагрузку? –

1

Это происходит потому, что, когда вы перезагружаете свою ячейку, вид таблицы снова запрашивает высоты всех ячеек. Любые ячейки, которые находятся вне экрана над вашей полосой прокрутки, будут запрашивать их оцененные высоты строк, и если они отличаются от их текущей высоты, это приведет к тому, что ячейки изменят высоту, и вы увидите, что столбик подобен этому.

Как только ваши ячейки рассчитаны на высоту, вы должны кэшировать это значение где-нибудь, а затем реализовать tableView:estimatedHeightForRowAtIndexPath: и вернуть фактическую высоту ячеек, если они имеют одну, а не вашу предполагаемую высоту.

+0

Как кешировать высоту строки, потому что я не использую heightforRowAtIndexPath. Также я не вычисляю высоту строки. Я в зависимости от расчетной высоты строки – Ranjit

Смежные вопросы