当前位置:  开发笔记 > 编程语言 > 正文

实现TouchesMoved的正确方法?

如何解决《实现TouchesMoved的正确方法?》经验,为你挑选了2个好方法。

我有一个自定义UIView,它生成一组子视图,并以像tile这样的行和列显示它们.我想要实现的是允许用户触摸屏幕,当手指移动时,其下方的瓷砖消失.

下面的代码是包含切片的自定义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

这种方法可行,但是如果瓷砖变得更密集(即屏幕上的小瓷砖和更多瓷砖).随着手指的移动,iPhone的响应速度也会降低.可能是hitTest对处理器造成了影响,因为它很难跟上,但想要一些意见.

我的问题是:

    这是实现touchesMoved的有效方式/正确方法吗?

    如果不是,推荐的方法是什么?

    我尝试将功能移动到自定义Tile类(子UIView)中,上面的类将创建并添加为子视图.此子视图Tile可以处理TouchesBegan但是当手指移动时,其他图块也不会接收TouchesBegan,即使触摸仍然是初始触摸序列的一部分.有没有办法通过子视图Tile类实现它,当手指移动时,其他tile如何接收TouchesBegan/TouchesMoved事件?

Ben Gottlieb.. 11

    根据我的经验,不是真的.

    从您设置视图的方式来看,似乎有一种更有效的方法来确定哪一个被点击:

 //In your init method, make sure each tile doesn't respond to clicks on its own
 ...
 tile.userInteractionEnabled = NO;
 ...


 - (void) touchesMoved: (NSSet *)touches withEvent:(UIEvent *)event {
      CGPoint tappedPt = [[touches anyObject] locationInView: self];
      int     xPos = tappedPt.x / (TILE_SPACING + TILE_PADDING);
      int     yPos = tappedPt.y / (TILE_SPACING + TILE_PADDING);
      int     tilesAcross = (self.bounds.size.width / (TILE_SPACING + TILE_PADDING));
      int     index = xPos + yPos * tilesAcross;

      if (index < self.subviews.count) {
          UIView  *tappedTile = [self.subviews objectAtIndex: index];
          tappedTile.hidden = YES;
      }
  }

    您需要更清楚地决定父母应该发生什么,以及每个瓷砖应该发生什么.您在上面提到过,您希望磁贴接收touchesBegan事件,但您没有包含任何代码.正如您所说,您应该考虑使用图层而不是视图(如果您没有进行任何特定于图块的事件处理).你在这里得到的一切都可以通过父母内部的事件跟踪来完成.请记住,如果你有太多的视图(或层),它会变慢.我们在填字游戏中尝试了15x15的网格,虽然对某些事情没问题,但最终我们放弃了网格层方法.

(不知道为什么编号在这里重新开始1 ...)



1> Ben Gottlieb..:

    根据我的经验,不是真的.

    从您设置视图的方式来看,似乎有一种更有效的方法来确定哪一个被点击:

 //In your init method, make sure each tile doesn't respond to clicks on its own
 ...
 tile.userInteractionEnabled = NO;
 ...


 - (void) touchesMoved: (NSSet *)touches withEvent:(UIEvent *)event {
      CGPoint tappedPt = [[touches anyObject] locationInView: self];
      int     xPos = tappedPt.x / (TILE_SPACING + TILE_PADDING);
      int     yPos = tappedPt.y / (TILE_SPACING + TILE_PADDING);
      int     tilesAcross = (self.bounds.size.width / (TILE_SPACING + TILE_PADDING));
      int     index = xPos + yPos * tilesAcross;

      if (index < self.subviews.count) {
          UIView  *tappedTile = [self.subviews objectAtIndex: index];
          tappedTile.hidden = YES;
      }
  }

    您需要更清楚地决定父母应该发生什么,以及每个瓷砖应该发生什么.您在上面提到过,您希望磁贴接收touchesBegan事件,但您没有包含任何代码.正如您所说,您应该考虑使用图层而不是视图(如果您没有进行任何特定于图块的事件处理).你在这里得到的一切都可以通过父母内部的事件跟踪来完成.请记住,如果你有太多的视图(或层),它会变慢.我们在填字游戏中尝试了15x15的网格,虽然对某些事情没问题,但最终我们放弃了网格层方法.

(不知道为什么编号在这里重新开始1 ...)



2> Corey Floyd..:

另外,您可以检查点是否位于代表每个子视图框架的CGRect中,而不是命中测试.我有一个类似的应用程序,这对我来说效果最好.

for (UIView* aSubview in self.subviews) {

    if([aSubview pointInside: [self convertPoint:touchPoint toView:aSubview] withEvent:event]){

       //Do stuff
    }
}

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有