触摸事件问题

时间:2010-11-24 10:36:53

标签: iphone

我在处理触摸事件时发现了一个非常奇怪的问题。应用程序的想法是我有一个ImageView,其中包含一个带有文本的圆圈,用户可以旋转。 我已经实现了一个自定义的UIScrollView子类来包含圆形图像。在那里我实现了touchesBegan,touchesMoved和touchesEnded方法,以便在用户向左或向右拖动时旋转我的圆圈。一切正常,但当你试图用一根手指从一侧快速拖动到另一侧并且方向相反时,方法touchesBegan和touchesEnded被称为不同的次数。例如,touchesBegan被称为1次并触及2至3次。怎么会这样?

   - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    if([[event touchesForView:self] count]==1){

            touchPoint = [[touches anyObject] locationInView:self];
            previousTouchPoint = touchPoint;
            angle = 0;
            if (((touchPoint.x > 160)&&(touchPoint.y < 210))||((touchPoint.x < 160)&&(touchPoint.y > 210))) {
                leftRotation = YES;
            }
            else {
                leftRotation = NO;
            }

            currentMoveAngle = 0;
        }
    }

    - (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event{
        if([[event touchesForView:self] count] == 1){
                CGPoint newPoint = [[touches anyObject] locationInView:self];
                CGPoint origin;
                if (self.tag == 2) {
                    origin = CGPointMake(self.bounds.origin.x+self.bounds.size.width*0.5, 215);
                }
                else {
                    origin = CGPointMake(self.bounds.origin.x+self.bounds.size.width*0.5, 215);
                }
                previousTouchPoint.x -= origin.x;
                previousTouchPoint.y -= origin.y;
                CGPoint second = newPoint;
                second.x -= origin.x;
                second.y -= origin.y;
                CGFloat rotationAngle = [self rotationFromFirstPoint:previousTouchPoint toSecondPoint:second];

                previousTouchPoint = newPoint;
                [self rotateContentToAngle:rotationAngle animated:NO];
                currentMoveAngle += rotationAngle; 
            }

    }

- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event{
    if ([[event touchesForView:self] count] == 1){
        rotating = YES;
            CGFloat rotationAngle;
            CGPoint origin = CGPointMake(self.bounds.origin.x+self.bounds.size.width*0.5, 215);
            CGPoint lastPoint = [[touches anyObject] locationInView:self];
            CGPoint touchP = touchPoint;
            if ((touchP.x != lastPoint.x)||(touchP.y != lastPoint.y)) {
                touchP.x -= origin.x;
                touchP.y -= origin.y;
                lastPoint.x -= origin.x;
                lastPoint.y -= origin.y;

                if (fabs(currentMoveAngle)>M_PI/6) {
                     NSInteger index = (int)trunc(currentMoveAngle/(M_PI/3));
                     currentMoveAngle-=(M_PI/3)*index;
                    NSLog(@"rotation index: %i",index);
                 }

                if (leftRotation) {
                    rotationAngle = M_PI/3;
                    rotationAngle-=currentMoveAngle;
                }
                else {
                    rotationAngle = (-1)*M_PI/3;
                    rotationAngle-=currentMoveAngle;
                }

                [self rotateContentToAngle:rotationAngle animated:YES];
            }   
        }
}

1 个答案:

答案 0 :(得分:0)

UIScrollView处理触摸事件非常糟糕....可能是因为拖动scrollView而发生的事情。

试试这个

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    if (!self.dragging){   
   if([[event touchesForView:self] count]==1){

        touchPoint = [[touches anyObject] locationInView:self];
        previousTouchPoint = touchPoint;
        angle = 0;
        if (((touchPoint.x > 160)&&(touchPoint.y < 210))||((touchPoint.x < 160)&&(touchPoint.y > 210))) {
            leftRotation = YES;
        }
        else {
            leftRotation = NO;
        }

        currentMoveAngle = 0;
    }
}
}

- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event{
  if (!self.dragging){      
  if([[event touchesForView:self] count] == 1){
            CGPoint newPoint = [[touches anyObject] locationInView:self];
            CGPoint origin;
            if (self.tag == 2) {
                origin = CGPointMake(self.bounds.origin.x+self.bounds.size.width*0.5, 215);
            }
            else {
                origin = CGPointMake(self.bounds.origin.x+self.bounds.size.width*0.5, 215);
            }
            previousTouchPoint.x -= origin.x;
            previousTouchPoint.y -= origin.y;
            CGPoint second = newPoint;
            second.x -= origin.x;
            second.y -= origin.y;
            CGFloat rotationAngle = [self rotationFromFirstPoint:previousTouchPoint toSecondPoint:second];

            previousTouchPoint = newPoint;
            [self rotateContentToAngle:rotationAngle animated:NO];
            currentMoveAngle += rotationAngle; 
        }

}
}

 - (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event{
   if (!self.dragging){    
   if ([[event touchesForView:self] count] == 1){
    rotating = YES;
        CGFloat rotationAngle;
        CGPoint origin = CGPointMake(self.bounds.origin.x+self.bounds.size.width*0.5, 215);
        CGPoint lastPoint = [[touches anyObject] locationInView:self];
        CGPoint touchP = touchPoint;
        if ((touchP.x != lastPoint.x)||(touchP.y != lastPoint.y)) {
            touchP.x -= origin.x;
            touchP.y -= origin.y;
            lastPoint.x -= origin.x;
            lastPoint.y -= origin.y;

            if (fabs(currentMoveAngle)>M_PI/6) {
                 NSInteger index = (int)trunc(currentMoveAngle/(M_PI/3));
                 currentMoveAngle-=(M_PI/3)*index;
                NSLog(@"rotation index: %i",index);
             }

            if (leftRotation) {
                rotationAngle = M_PI/3;
                rotationAngle-=currentMoveAngle;
            }
            else {
                rotationAngle = (-1)*M_PI/3;
                rotationAngle-=currentMoveAngle;
            }

            [self rotateContentToAngle:rotationAngle animated:YES];
        }   
      }       }
      }


or make scrollingEnabled property NO.