0

含まれるテキストの量に応じて各行の高さを計算する UITableViewController を作成しました。行の高さを計算するコードは次のようになります。

- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);
    Message *message = [[[[SessionData sharedSessionData] sessions] objectAtIndex:[indexPath section]] objectAtIndex:[indexPath row]];
    CGSize size = [[message text] sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];

    return size.height + (CELL_CONTENT_MARGIN * 2) + 38;
}

お気づきかもしれませんが、SessionData という別のクラスを UITableViewDatasource として使用しています。SessionData クラス内で行を描画します。各行には、上部の画像、中央の画像 (行の高さに応じて繰り返される)、および下部の画像があります。私の問題は次のとおりです。中央の画像は、下と上の画像よりも少し暗く描かれています。上部と下部の画像がうまく描画されているため、これは画像の繰り返しの性質と関係があると思います。次のコードは、[tableView:cellForRowAtIndexPath:] メッセージの一部です。

- (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];
    }

    // other stuff here, most likely not related to my issue ...

    Message *message  = [[sessions objectAtIndex:[indexPath section]] objectAtIndex:[indexPath row]];       
    CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);
    CGSize size = [[message text] sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];

    [label setText:[message text]];
    [label setFrame:CGRectMake(CELL_CONTENT_MARGIN, CELL_CONTENT_MARGIN - 5.0f, CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), size.height)];
    [label setBackgroundColor:[UIColor clearColor]];

    viewTop = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"im1 top.png"]];
    viewMid = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"im1 mid.png"]];
    viewBot = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"im1 bot.png"]];      

    [viewTop setFrame:CGRectMake(0.0, 0.0, 300.0, 17.0)];
    [viewMid setFrame:CGRectMake(0.0, 17.0, 300.0, size.height - 10)];
    [viewBot setFrame:CGRectMake(0.0, 17.0 + size.height - 10, 300.0, 31.0)];

    [viewTop setBackgroundColor:[UIColor clearColor]];
    [viewMid setBackgroundColor:[UIColor clearColor]];
    [viewBot setBackgroundColor:[UIColor clearColor]];  

    [cell.backgroundView setBackgroundColor:[UIColor clearColor]];

    [((UIImageView *)cell.backgroundView) addSubview:viewTop];  
    [((UIImageView *)cell.backgroundView) addSubview:viewMid];  
    [((UIImageView *)cell.backgroundView) addSubview:viewBot];

    [[cell backgroundView] addSubview:label];   

    return cell;
}

私の推測では、上部、中央、および下部の imageView の合計サイズ (幅、高さ) で containerView を作成し、containerView をセルに追加する必要がありますが、これは機能していないようです。誰でもこの問題を解決する方法について何か考えがありますか?

注意してください: 私の UITableViewController には、背景画像としてグラデーションがあります。したがって、上/中央/下の画像は背景のグラデーションの上に描画されます。おそらく、これも問題の一部です。

4

2 に答える 2

1

ここで注意すべき点がいくつかあります。

まず、セル内で多くの処理が行われているため、デバイスでのスクロール パフォーマンスが非常に低下します。セルの再キューイングと、ここにあるすべてのセルに共通のセル設定のほとんどの実行をより有効に活用する必要があります。

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        // Do cell layout in here!
    }

そうすれば、セルが画面に表示されるたびにセルとそのサブビューを再作成するのではなく、再利用できます (ビューのtagプロパティとviewWithTag:メソッドを使用します)。

次に、伸縮可能な画像を見たいと思うかもしれません。

第 3 に、セルを手動で描画すると、パフォーマンスが大幅に向上します。カスタム ビュー (コンテンツ ビューに追加する) を作成し、 をオーバーライドし、のメソッドdrawRect:を使用してそれらに画像を描画します。これにより、作業が大幅に高速化されます。サブビューのレイアウトはコストがかかるため、できる限り描画してください。また、可能であれば UIView (UIImageView、UILabel などを含む) の透過性を使用しないようにし、背景色を設定して設定します。透明な UILabel の外観を与えるのメソッドを使用して、でテキストを描画することをお勧めします。UIImagedrawInRect:opaque = YESdrawRect:NSStringdrawInRect:

ただし、セルが非常に少ない場合 (< 4 など) は、描画方法が多すぎる可能性があります。しかし、それはまだ非常にお勧めです!

お役に立てれば!

于 2010-01-18T09:50:22.033 に答える
0

マイケルの提案をありがとう。次のコードを使用して、グラフィックの問題を実際に修正できました。

[bubbleView setImage:[bubble stretchableImageWithLeftCapWidth:165 topCapHeight:30]];

3つの別々の画像を使用してチャットバブルを作成する代わりに、1つの画像を使用できるようになり、優雅に伸びます。確かに非常に素晴らしい提案:)

速度の問題はあまりないようですが、主にコードのセル初期化部分でセルの主要部分を作成することにより、提案どおりにコードを部分的に書き直しました。私はマイナーな速度の改善に気づきました、おそらくそれは(シミュレーターと比較して)デバイス上でより顕著です。

現在もImageViewを使用して画像を描画しています(お気づきかもしれませんが)。レンダリングの速度を上げる必要がある場合は、[UIImage drawInRect:]を確認します。

あなたの提案をありがとう、大いに感謝します。

于 2010-01-18T13:58:45.950 に答える