既不触摸结束也不触摸取消有时在触摸移动后不调用



我的应用程序中有一个圆形视图,我正在该圆形视图中移动一些对象,例如图形,它在 90% 的情况下工作正常,但在某些情况下它不会调用TouchEnded并且我的重置图形代码在 TouchEnded 方法中,因此在下面的某个时候卸载了它是我的触摸委托方法的代码。

#pragma mark - Touch Events For Rotation of GRAPH
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
UITouch* touch = [touches anyObject];
CGPoint touchPoint = [touch locationInView:self.view];
    prevAngle = [Utilities angleBetweenPoint:touchPoint toPoint:self.view.center];
/// convert negative angle into positive angle
    if(prevAngle < 0){
        prevAngle = PI_DOUBLE + prevAngle;
    }
    //
    [_viewStaticRadialPart hideToolTip];
}
- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
    CGFloat diffAngle, tempCurAngle, tempPrevAngle, curTransformAngle, newTransformAngle;
    NSLog(@"touchesMoved");
// Get the only touch (multipleTouchEnabled is NO)
    UITouch* touch = [touches anyObject];
    // Track the touch
    CGPoint touchPoint = [touch locationInView:self.view];

    curAngle = [Utilities angleBetweenPoint:touchPoint toPoint:self.view.center];
    /// convert negative angle into positive angle
    if(curAngle < 0){
        curAngle = PI_DOUBLE + curAngle;
    }
        prevAngle = curAngle;
}
-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self resetViewsOnceRotationStops];

}
- (void)touchesCancelled:(nullable NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
{
    [resetViewsAfterTouchStops invalidate];
    resetViewsAfterTouchStops = nil;
}

自昨晚以来,我被困在这里,所以任何帮助将不胜感激。

提前谢谢。

我不知道这个问题

的核心原因。

但是NSTimer可以帮助我们

但我觉得我们可以通过在调用touchesMoved时添加设置/替换NSTimer实例来解决此问题,我们可以在 touchesEndedtouchesCancelled 上重置该计时器。因此,无论哪种情况,您的touchesEnded或未调用计时器touchesCancelled都将完成这项工作,并且重置逻辑将按预期工作。

演示源代码

- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
    NSLog(@"touchesMoved");
    //Timer re-initialize code here
    if (resetViewsAfterTouchStops) {
         [resetViewsAfterTouchStops invalidate];
         resetViewsAfterTouchStops = nil;
    }
    resetViewsAfterTouchStops =  [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(resetViewsOnceRotationStops) userInfo:nil repeats:NO];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    isTouched = NO;
    [resetViewsAfterTouchStops invalidate];
    resetViewsAfterTouchStops = nil;
    [self resetViewsOnceRotationStops];
    [self setUserInteractionOnSectorsAs:YES];
}
- (void)touchesCancelled:(nullable NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
{
    NSLog(@"touchesCancelled");
    if(resetViewsAfterTouchStops)
    {
         [self resetViewsOnceRotationStops];
         [self setUserInteractionOnSectorsAs:YES];
    }
    [resetViewsAfterTouchStops invalidate];
    resetViewsAfterTouchStops = nil;
}
- (void) resetViewsOnceRotationStops
{
    //your reset code will be place here
}

如果您正在使用任何对象,请尝试删除该视图上的UIGestureRecognizer对象。 UIGestureRecognizer对象会干扰触摸事件生命周期。

最新更新