1

を継承する独自のTableViewCellクラスがあります。私のセルnibファイルでは、画像を. (画像はセル領域全体を完全に占有しておらず、画像の周囲にスペースがあります) UITableViewCellTableViewCell

次に、ユーザーがセル内の画像をタッチすると、画像が別の画像に置き換えられるタッチ フィードバック機能を実装したいと思います。

私は方法でそれをやろうとしましたtableView:didSelectRowAtIndexPath::

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //my TableViewCell   
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    //New image to replace the current one
    UIImage* bg = [CCTheme imageNamed:@"green_btn_bg"];
    UIImageView* bgView = [[UIImageView alloc] initWithImage:bg];

    cell.selectedBackgroundView = bgView;
    ...

しかし、それはまったく機能しません。では、このタッチ フィードバック機能を実装するにはどうすればよいでしょうか?? ユーザーの指がセル内の画像に触れたとき、画像は別の画像に変更されます。

4

3 に答える 3

0
  • 最初にdidSelectRowAtIndexPath:データ モデルを変更する必要があります (セルのステータスが変更されたことを示します)。
  • 適切な画像を設定します cellForRowAtIndexPath:。(つまり、ステータスが何であるかを確認し、正しいイメージを提供します。)
  • セルを更新するには、 を呼び出しますreloadRowsAtIndexPaths:

説明

セルのビューにセルの状態を保存しないでください。たとえば、別の画像が何らかの選択を表している場合、テーブル ビューにフィードする配列またはその他のデータ構造は、どの行がこの状態にあるかを追跡する必要があります。

セルを再生成する必要があるたびに、cellForRowAtIndexPathが呼び出されます。(これは、セルが表示されるか、明示的に更新されたことが原因である可能性があります。) これは、状態情報を確認し、それに応じてセルを表示するのに最適な場所です。

于 2013-04-25T14:13:16.997 に答える
0

UIImageViewカスタムUITableViewCellクラスにプロパティを作成し、背景プロパティではなくIBOutletそのプロパティに画像を設定します。cellForRowAtIndexPath:

cell.yourCustomImageView.image = bgView;

または、以下のように UIImageView を現在の汎用 UITableViewCell に追加します。

現在のセルで

[cell addSubview:bgView];
于 2013-04-25T15:09:09.560 に答える
0

UIImageViewカスタム セルの init メソッド内にジェスチャ レコグナイザーをフックすることをお勧めします。

// Add recognizer for tappable image
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc]
                                         initWithTarget:self action:@selector(imageViewTapped:)];
[tapRecognizer setNumberOfTouchesRequired:1];
[tapRecognizer setDelegate:self];

self.tappableImageView.userInteractionEnabled = YES;
[self.tappableImageView addGestureRecognizer:tapRecognizer];

次に、ハンドラー:

- (void)imageViewTapped:(id)sender {

    NSLog(@"image tapped");
    self.tappableImageView.image = [UIImage imageNamed:@"some_different_image.png"];
}

また、カスタム セル宣言を次のように装飾することを忘れないでください。

@interface CustomTableViewCell : UITableViewCell <UIGestureRecognizerDelegate>

cellForRowAtIndexPath:メソッドでは、 init メソッドのコードが起動され、tapRecognizerが追加されるようにする必要があります。

幸運を!

[編集]

カスタム XIB を使用してセルを作成する方法によっては、これが必要ない場合もありますが、私の場合は、テーブル セルの UI の状態を初期化するメソッドを明示的に呼び出す必要がありました。initStateこれを行う方法は、カスタム テーブル ビュー セルでメソッドを提供することです。

- (void)initState {

    // Do other things for state of the UI in table cell.

    // Add recognizer for tappable image
    UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc]
                                         initWithTarget:self action:@selector(imageViewTapped:)];
    [tapRecognizer setNumberOfTouchesRequired:1];
    [tapRecognizer setDelegate:self];

    self.tappableImageView.userInteractionEnabled = YES;
    [self.tappableImageView addGestureRecognizer:tapRecognizer];
}

次に、作成後にテーブル セルcellForRowAtIndexPathを呼び出すようにします。initState

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    CustomTableViewCell *cell = (CustomTableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {

        UIViewController *temporaryController = [[UIViewController alloc] initWithNibName:@"CustomTableViewCell" bundle:nil];
        // Grab a pointer to the custom cell.
        cell = (CustomTableViewCell *)temporaryController.view;

        [cell initState];
    }

    return cell;

}
于 2013-04-25T16:32:30.387 に答える