0

既に選択されているセルを再選択 (指を離さずにタッチ) するときの UITableViewCell の textLabel プロパティに関する問題があります。

動的な高さ (セルを含む) を持つ textLabel のすぐ下の背景に追加されているカスタム contentView と、一貫して同じ高さ (50.0f っぽい) である textLabel の背景もあります。

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: が機能するとは思わず、beginUpdates/endUpdates が呼び出された後に textLabel フレームをリセットするデリゲート メソッドがあるかどうか疑問に思っていました。

フレームの変更にログインしましたが、次のように表示されます。

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>>

高さは、これら 2 つのメソッドが呼び出される前は 199 を示し、その後は 50 を示します。ただし、強制的なフレームの変更に関係なく、選択したセルが再選択されるたびに、textLabel はセル内で垂直方向に再センタリングされ続けます。

誰かが助けてくれれば、私は大歓迎です。

写真の例へのリンク -> http://i50.tinypic.com/2r6o5k5.jpg

4

2 に答える 2

0

セルが正しく選択されているときの高さ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 をチェックしているので、上記の条件も追加します。コードの多くを変更する必要はありません。

于 2013-03-20T03:58:04.540 に答える
0

これを試してください:

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

カスタムではなくデフォルトのラベルを使用しているため、セルの高さを増やす必要があります

于 2013-03-20T04:44:39.620 に答える