IOS 应用检测碰擦手势分析

作者:朱克锋

邮箱:[email protected]

转载请注明出处:http://blog.csdn.net/linux_zkf


水平和垂直的碰擦(Swipe)是简单的手势类型,您可以简单地在自己的代码中进行跟踪,并通过它们执行某些动作。为了检测碰擦手势,您需要跟踪用户手指在期望的座标轴方向上的运动。碰擦手势如何形成是由您自己来决定的,也就是说,您需要确定用户手指移动的距离是否足够长,移动的轨迹是否足够直,还有移动的速度是否足够快。您可以保存初始的触碰位置,并将它和后续的touch-moved事件报告的位置进行比较,进而做出这些判断。
程序清单展示了一些基本的跟踪方法,可以用于检测某个视图上发生的水平碰擦。在这个例子中,视图将触摸的初始位置存储在名为startTouchPosition的成员变量中。随着用户手指的移动,清单中的代码将当前的触摸位置和起始位置进行比较,确定是否为碰擦手势。如果触摸在垂直方向上移动得太远,就会被认为不是碰擦手势,并以不同的方式进行处理。但是,如果手指继续在水平方向上移动,代码就继续将它作为碰擦手势来处理。一旦碰擦手势在水平方向移动得足够远,以至于可以认为是完整的手势时,处理例程就会触发相应的动作。检测垂直方向上的碰擦手势可以用类似的代码,只是把x和y方向的计算互换一下就可以了。
程序清单 在视图中跟踪碰擦手势
 
#define HORIZ_SWIPE_DRAG_MIN  12     
#define VERT_SWIPE_DRAG_MAX    4
             
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event     
{   

    UITouch *touch = [touches anyObject];      

    startTouchPosition = [touch locationInView:self];     
}
        
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event      
{      
    UITouch *touch = [touches anyObject];      
    CGPoint currentTouchPosition = [touch locationInView:self];      
    // If the swipe tracks correctly.      
    if (fabsf(startTouchPosition.x - currentTouchPosition.x) >= HORIZ_SWIPE_DRAG_MIN &&      
        fabsf(startTouchPosition.y - currentTouchPosition.y) <= VERT_SWIPE_DRAG_MAX)      
    {      
        // It appears to be a swipe.     
        if (startTouchPosition.x < currentTouchPosition.x)     

            [self myProcessRightSwipe:touches withEvent:event];

        else     
            [self myProcessLeftSwipe:touches withEvent:event];     
    }      
    else     
    {    
        // Process a non-swipe event.      
    }      
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章