测试UIImageView上的夹点(不要捏和缩放 - 只需测试夹点)

时间:2011-03-24 11:35:41

标签: iphone multi-touch

这不是另一个“那些”问题,不用担心。

基本上我想测试一个捏然后运行动画。这是我目前的代码:

// test for a pinch
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSSet *allTouches = [event allTouches];
    if([allTouches count] == 2){
        //there are two touches...
        UITouch *firstTouch = [[allTouches allObjects] objectAtIndex:0];
        UITouch *secondTouch = [[allTouches allObjects] objectAtIndex:1];
        CGPoint firstPoint = [firstTouch locationInView:self.superview];
        CGPoint secondPoint = [secondTouch locationInView:self.superview];

        int X1 = firstPoint.x;
        int Y1 = firstPoint.y;
        int X2 = secondPoint.x;
        int Y2 = secondPoint.y;

        // lets work out the distance:
        // sqrt( (x2-x1)^2 + (y2-y1)^2 );
        preDistance = sqrtf( (float)pow((X2-X1),2) + (float)pow((Y2-Y1),2) );

    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    NSSet *allTouches = [event allTouches];
    if([allTouches count] == 2){
        //there are two touches...
        UITouch *firstTouch = [[allTouches allObjects] objectAtIndex:0];
        UITouch *secondTouch = [[allTouches allObjects] objectAtIndex:1];
        CGPoint firstPoint = [firstTouch locationInView:self.superview];
        CGPoint secondPoint = [secondTouch locationInView:self.superview];

        int X1 = firstPoint.x;
        int Y1 = firstPoint.y;
        int X2 = secondPoint.x;
        int Y2 = secondPoint.y;

        // lets work out the distance:
        // sqrt( (x2-x1)^2 + (y2-y1)^2 );
        postDistance = sqrtf( (float)pow((X2-X1),2) + (float)pow((Y2-Y1),2) );

        // lets test now
        // if the post distance is LESS than the pre distance then
        // there has been a pinch INWARDS
        if(preDistance > postDistance){
            NSLog(@"Pinch INWARDS");
            // so we need to move it back to its small frame
            if(CGRectEqualToRect(self.frame, largeFrame) && !CGRectIsEmpty(self.smallFrame)){
                // we can go inwards
                [UIView beginAnimations:nil context:nil];
                [UIView setAnimationDuration:0.5];
                self.frame = smallFrame;
                [UIView commitAnimations];
            }
        }
        else {
            NSLog(@"Pinch OUTWARDS");
            // so we need to move it back to its small frame
            if(!CGRectEqualToRect(self.frame, largeFrame)){
                // we can go outwards
                // set org frame
                smallFrame = self.frame; // so we can go back later
                [UIView beginAnimations:nil context:nil];
                [UIView setAnimationDuration:0.5];
                self.frame = largeFrame;
                [UIView commitAnimations];
            }
        }

    }
}

如果有多点触摸,它只测量两次触摸之间的距离,然后在触摸结束时再次测量距离。如果两者之间的差异为正,那么它是向外挤压,如果是负值则是向内挤压。

根据捏合的方向,图像视图将在设置 CGRects中扩大或缩小(这就是为什么我不想要“正常”捏合和缩放功能)。我只是希望它能够再次上下缩放图像。

然而,这不是很好......它总是不会收拾。我不知道这是不是因为它的视图也在检测触摸(只有单个捏),但仍然...

无论如何,我想知道是否有人有更好的方法来检测捏?我目前已经将UIImageView子类化为创建我的ImageController类,其中包含这些触摸方法。我需要知道的是a)他们正在触摸这个图像,b)他们捏了哪个方向。

由于

3 个答案:

答案 0 :(得分:3)

查看文档中的UIPinchGestureRecognizer。我没有用它,但似乎只是你需要它。

答案 1 :(得分:1)

  

无论如何,我想知道是否有人有更好的方法来检测捏?

如果你的目标是iOS 3.2及更高版本,你可以使用手势识别器 - 没有充分的理由不这样做。如果您需要定位3.2之前的版本,那么您的上述方法(或其中的变量,使用touchesBegin等)是唯一的方法,因此它只是调整算法。

如果可以,我强烈建议您使用UIPinchGestureRecognizer。它将使您的生活变得更加轻松,因为它可以处理所有细节。如果你想要检测捏的比例和方向,你可以将UIPinchGestureRecognizerUIRotationGestureRecognizer结合起来 - 前者只会给你一个捏的比例,而不是相对角。

答案 2 :(得分:1)

如果你没有3.1.x设备,我建议你使用UIPinchGestureRecognizer。它使用起来非常简单,但问题是你只能在运行3.2及更高版本的iOS设备上运行它。

出于某种原因,您使用locationInView来确定触摸的位置。您是否尝试识别当前视图中的触摸位置(实际图像视图)?调用超级视图意味着您将获得包含图像视图的视图中的触摸位置。