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

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

У меня есть пользовательский контентView, добавляемый в фоновом режиме чуть ниже 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


person Bill    schedule 20.03.2013    source источник
comment
Я склоняюсь к созданию подкласса UITableViewCell и работе с layoutSubviews, основываясь на связанных проблемах.   -  person Bill    schedule 20.03.2013
comment
К сожалению, создание подкласса UITableViewCell и работа с layoutSubviews не сработали. Проблема сохраняется, когда пользователь повторно выбирает выбранную ячейку, а размеры textLabel сбрасываются, чтобы соответствовать новой расширенной высоте ячейки при центрировании текста по вертикали.   -  person Bill    schedule 20.03.2013


Ответы (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, добавьте вышеуказанное условие. Вам не нужно менять большую часть кода.

person Anand    schedule 20.03.2013
comment
Что ж, я пытаюсь зафиксировать textLabel вверху, когда ячейка увеличивается в высоту (без особых визуальных изменений, кроме размеров и цветов шрифта). - person Bill; 20.03.2013
comment
@Bill, можешь добавить снимок. так что это поможет нам - person Anand; 20.03.2013
comment
Я разместил ссылку на изображение, потому что у меня еще недостаточно репутации для публикации изображений. - person Bill; 20.03.2013
comment
Хорошо. Я понимаю, я должен отменить выбор строки, если это та же самая строка, верно? РЕДАКТИРОВАТЬ: я только что попытался отменить выбор строки, но в итоге получил тот же результат. - person Bill; 20.03.2013
comment
@Bill Я упоминаю, что нельзя выполнять действие отмены выбора для ячейки, если она уже выбрана. Хорошо Вот ссылка, которую я написал для вас. ziddu.com/download/21842790/expandableTableview.zip.html - person Anand; 20.03.2013
comment
Большое спасибо! Ваше решение сработало. Я очень ценю вашу помощь! - person Bill; 21.03.2013

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

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

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

person Abha    schedule 20.03.2013