サブビューのセットを生成し、それらをタイルのように行と列に表示するカスタム UIView があります。私が達成しようとしているのは、ユーザーが画面に触れられるようにすることです。指が動くと、その下のタイルが消えます。
以下のコードは、タイルを含むカスタム UIView です。
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
int i, j;
int maxCol = floor(self.frame.size.width/TILE_SPACING);
int maxRow = floor(self.frame.size.height/TILE_SPACING);
CGRect frame = CGRectMake(0, 0, TILE_WIDTH, TILE_HEIGHT);
UIView *tile;
for (i = 0; i<maxCol; i++) {
for (j = 0; j < maxRow; j++) {
frame.origin.x = i * (TILE_SPACING) + TILE_PADDING;
frame.origin.y = j * (TILE_SPACING) + TILE_PADDING;
tile = [[UIView alloc] initWithFrame:frame];
[self addSubview:tile];
[tile release];
}
}
}
return self;
}
- (void)touchesBegan: (NSSet *)touches withEvent:(UIEvent *)event {
UIView *tile = [self hitTest:[[touches anyObject] locationInView:self] withEvent:nil];
if (tile != self)
[tile setHidden:YES];
}
- (void)touchesMoved: (NSSet *)touches withEvent:(UIEvent *)event {
UIView *tile = [self hitTest:[[touches anyObject] locationInView:self] withEvent:nil];
if (tile != self)
[tile setHidden:YES];
}
このアプローチは機能しますが、タイルの密度が高くなる場合 (つまり、画面上のタイルが小さくなり、タイルが多くなる場合) は機能します。iPhone は、指の動きに応じて反応が鈍くなります。hitTest が追いつくのに苦労しているため、プロセッサに負担がかかっている可能性がありますが、いくつかの意見が必要です。
私の質問は次のとおりです。
これは touchesMoved を実装する効率的な方法/正しい方法ですか?
そうでない場合、推奨されるアプローチは何ですか?
上記のクラスがサブビューとして作成および追加するカスタム Tile クラス (サブ UIView) に機能を移動しようとしました。このサブビュー タイルは TouchesBegan を処理できますが、指が移動すると、他のタイルはタッチが最初のタッチ シーケンスの一部であるため、TouchesBegan を受け取りません。サブビュー Tile クラスを介してそれを実装する方法はありますか? 他のタイルは、指の動きに応じて TouchesBegan/TouchesMoved イベントをどのように受け取りますか?