代码之家  ›  专栏  ›  技术社区  ›  Chris

在uiScrollView中使用uiTouch

  •  1
  • Chris  · 技术社区  · 14 年前

    只是玩弄sdk,我想知道ui触摸事件是否可以在uiscrollview中工作。

    我设置了一个uiScrollView来处理一个大的uiView,在uiView内部是一个uiImageView,我设法让uiTouch将uiImageView拖动到uiScrollView外部,但在它内部没有注册事件。

    我想我要做的是在大uiview周围拖动uiimageview,而uiscrollview沿着图像移动,如果用户拖动它超过uiview开始拖动时的位置,如果这有意义的话?

    多谢

    3 回复  |  直到 12 年前
        1
  •  4
  •   Vladimir    14 年前

    (如果我正确理解这个问题)

    uiScrollView截取 touchMoved 如果启用滚动,则不会将事件传播到其内容。因此,要在应用程序的uiscrollview内容中进行拖动,我执行了以下技巧:

    触摸开始: 检查是否触摸“可拖动”区域。如果是-在uiscrollview中禁用滚动。

    触摸移动: 现在,当禁用滚动时,内容视图将接收此事件,您可以相应地移动可拖动的uiImageView。

    触摸屏: 在uiscrollew中重新启用滚动。

    如果要将视图拖到可见的uiscrollview区域之外,您可能还需要手动检查是否靠近边界,并手动调整内容偏移量(我自己没有尝试过,但我认为应该可以)。

        2
  •  0
  •   jason debottis    12 年前

    实现这一点的最佳方法是将uiscrollview类本身子类化,然后在子类中添加touches-begind事件方法。这对我有用。

        3
  •  0
  •   RThomas    12 年前
    (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
    {
    
    NSLog(@"DEBUG: Touches began" );
    
    UITouch *touch = [[event allTouches] anyObject];
    
    [super touchesBegan:touches withEvent:event];
    }
    
    (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    
    NSLog(@"DEBUG: Touches cancelled");
    
    // Will be called if something happens - like the phone rings
    
    UITouch *touch = [[event allTouches] anyObject];
    
    [super touchesCancelled:touches withEvent:event];
    
    }
    
    
    (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    
    NSLog(@"DEBUG: Touches moved" );
    
    UITouch *touch = [[event allTouches] anyObject];
    
    [super touchesMoved:touches withEvent:event];
    
    }
    
    (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"DEBUG: Touches ending" );
    //Get all the touches.
    NSSet *allTouches = [event allTouches];
    
    //Number of touches on the screen
    switch ([allTouches count])
    {
        case 1:
        {
            //Get the first touch.
            UITouch *touch = [[allTouches allObjects] objectAtIndex:0];
    
            switch([touch tapCount])
            {
                case 1://Single tap
    
                    break;
                case 2://Double tap.
    
                    break;
            }
        }
            break;
    }
    [super touchesEnded:touches withEvent:event];
    }