这不是另一个“那些”问题,不用担心。
基本上我想测试一个捏然后运行动画。这是我目前的代码:
// 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)他们捏了哪个方向。
由于
答案 0 :(得分:3)
查看文档中的UIPinchGestureRecognizer。我没有用它,但似乎只是你需要它。
答案 1 :(得分:1)
无论如何,我想知道是否有人有更好的方法来检测捏?
如果你的目标是iOS 3.2及更高版本,你可以使用手势识别器 - 没有充分的理由不这样做。如果您需要定位3.2之前的版本,那么您的上述方法(或其中的变量,使用touchesBegin等)是唯一的方法,因此它只是调整算法。
如果可以,我强烈建议您使用UIPinchGestureRecognizer
。它将使您的生活变得更加轻松,因为它可以处理所有细节。如果你想要检测捏的比例和方向,你可以将UIPinchGestureRecognizer
与UIRotationGestureRecognizer
结合起来 - 前者只会给你一个捏的比例,而不是相对角。
答案 2 :(得分:1)
如果你没有3.1.x设备,我建议你使用UIPinchGestureRecognizer。它使用起来非常简单,但问题是你只能在运行3.2及更高版本的iOS设备上运行它。
出于某种原因,您使用locationInView
来确定触摸的位置。您是否尝试识别当前视图中的触摸位置(实际图像视图)?调用超级视图意味着您将获得包含图像视图的视图中的触摸位置。