我有一个自定义 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)中,上面的类将创建并添加为子视图。此子视图 Tile 可以处理 TouchesBegan,但随着手指移动,即使触摸仍然是初始触摸序列的一部分,其他图块也不会收到 TouchesBegan。有没有办法通过子视图Tile类来实现,其他瓦片如何在手指移动时接收到TouchesBegan/TouchesMoved事件?