既に選択されているセルを再選択 (指を離さずにタッチ) するときの 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