Тест на щепотку в UIImageView (не пинч и зум - просто тест на щепотку) - PullRequest
1 голос
/ 24 марта 2011

Это не один из "тех" вопросов, не волнуйтесь.

По сути, я хочу проверить щепотку, а затем запустить анимацию. Вот код, который у меня сейчас есть:

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

Спасибо

Ответы [ 3 ]

3 голосов
/ 24 марта 2011

Проверьте UIPinchGestureRecognizer в документации. Я не использовал его, но, похоже, это именно то, что вам нужно.

1 голос
/ 24 марта 2011

Если вы можете жить без устройств 3.1.x, я бы рекомендовал использовать UIPinchGestureRecognizer . Его очень просто использовать, но проблема в том, что вы сможете запускать его только на устройствах с iOS, начиная с версии 3.2 и выше.

По какой-то причине вы используете locationInView для определения положения касаний. Вы пытались определить местоположение касаний в текущем представлении (фактическом представлении изображения)? Вызов суперпредставления означает, что вы получите положение касаний в представлении, которое содержит представление вашего изображения.

1 голос
/ 24 марта 2011

В любом случае, мне было интересно, есть ли у кого-нибудь лучший способ обнаружения сдавливания?

Если вы ориентируетесь на iOS 3.2 и выше, вы можете использовать распознаватели жестов - нет веской причинык.Если вам нужно нацелиться на предварительный 3.2, то ваш вышеприведенный подход (или его варианты, используя touchesBegin и т. Д.) - единственный способ, так что он просто настраивает алгоритм.

Если вы можете ,Я настоятельно рекомендую использовать UIPinchGestureRecognizer.Это значительно облегчит вашу жизнь, так как обрабатывает все детали.Если вы хотите определить как масштаб, так и направление пинча, вы можете объединить UIPinchGestureRecognizer с UIRotationGestureRecognizer - первый просто даст вам масштаб пинча, а не относительный угол.

...