UITableViewCell textLabel высота сбрасывается после выбора / выделения той же ячейки

У меня есть проблема, связанная со свойством textLabel UITableViewCell при повторном выборе (касаясь, не поднимая палец) ячейки, которая уже выбрана.

У меня есть собственный contentView, добавляемый в фоновом режиме чуть ниже textLabel, который имеет динамическую высоту (включая ячейку), а также фон для textLabel, который всегда такой же высоты (50.0f-ish).

Я использую методы beginUpdates и endUpdates для анимации выделения и изменения фрейма, чтобы предотвратить центрирование textLabel в ячейке сразу после обновления; сохраняя это примерно в тех же границах фона. Нет проблем при выборе разных ячеек, и textLabel остается сверху, где и должно быть.

Основная проблема сейчас заключается в том, что когда пользователь снова касается пальца (не поднимая его) на выбранной ячейке, textLabel переходит в центр в соответствии с изменением высоты ячейки.

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        DetailView *detailView = // Create detail view

        // Add UIImageView from content to cell --------------------
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

        // Change textLabel colors, fontSize, and shadow properties
        // Create CustomContentView *ccView = nil;


        // ------
        // Remove / Hide any existing CustomContentViews
        // --- Code here
        // -------

        switch (hasImageInCustomView) {
        case YES:
            image = _imageInCustomView;
            image = NO;

            if (selectedIndexPath.row != indexPath.row) {
                [tableView beginUpdates];
                [tableView endUpdates];
            }

            CGRect frame = cell.textLabel.frame;
                    frame.size.height = 50.0f;
                    cell.textLabel.frame = frame;


            return;
        break;
        default:
            image = [detailView getImage];
        break;
        }

        // ----
        // Calculate height for image and add that to heightForExpandedRow property
        // -- Code here...
        // ----

        [tableView beginUpdates];
        [tableView endUpdates]; 

        // Add subview with UIImageView
        customContentView = [[CustomContentView alloc] initWithFrame:(CGRect){0, 0, kWidth, dynamicExpandedRow}];
        contentView.clipsToBounds = YES;
        [cell.contentView addSubview:customContentView];
        [cell.contentView sendSubviewToBack:customContentView];
        [customContentView setContentImage:image];

        CGRect frame = cell.textLabel.frame;
        frame.size.height = 50.0f;
        cell.textLabel.frame = frame;

}

Я использую iOS 3.0, поэтому я не думаю, что didHighlightRowAtIndexPath: будет работать, и мне было интересно, есть ли какие-либо методы делегатов, которые сбрасывают фрейм textLabel после вызова beginUpdates/endUpdates.

Я вошел в изменения кадра, и это выглядит так:

Перед вызовом beginUpdates/endUpdates

<UILabel: 0x4e55500; frame = (10 0; 250 199); text = 'Some Text Goes Here...'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x4e55570>>

После того, как beginUpdates/endUpdates были вызваны и ручная смена кадра

<UILabel: 0x4e55500; frame = (10 0; 250 50); text = 'Some Text Goes Here...'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x4e55570>>

Высота показывает 199 перед вызовом этих двух методов и 50 после. Однако textLabel продолжает повторно центрироваться в ячейке по вертикали всякий раз, когда выбранная ячейка повторно выбирается, независимо от принудительного изменения кадра.

Если кто-то может помочь, я буду очень признателен.

Ссылка на пример изображения -> http://i50.tinypic.com/2r6o5k5.jpg

2 ответа

Решение

Вы меняете высоту UILabel когда ячейка выбрана правильно, добавьте условие перед изменением высоты UILabel.

т.е. изначально selectedIndexRow будет -1.

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//Check if we are selecting the same cell
        if(selectedIndexRow != indexPath.row){
           if(selectedIndexRow != -1){

        //deselect the previous cell
        }

            selectedIndexRow = indexPath.row;

        //preform your action

        }
    }

Поскольку вы проверяете selectedIndex, добавьте вышеупомянутое условие. Вам не нужно менять большую часть кода.

Попробуй это:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 50;
}

Вы должны увеличить высоту ячейки, потому что вы используете метку по умолчанию, а не пользовательскую

Другие вопросы по тегам