Это не один из "тех" вопросов, не волнуйтесь.
По сути, я хочу проверить щепотку, а затем запустить анимацию. Вот код, который у меня сейчас есть:
// 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, в котором есть эти сенсорные методы. Все, что мне нужно знать, это: а) они касаются этого изображения и б) в каком направлении они ущипнули.
Спасибо