在下一次触摸之前未能收到系统手势状态通知

34

我有一个控件可以在一个视图中交替切换两个视图。也就是说,两个视图控制器通过子视图方法添加到容器视图中。通过捏合手势可以将当前视图缩小,并显示第二个视图。如果想回到先前的视图,再次捏合手势即可。问题是,有时候视图不会对手势做出反应,而且有一条消息

"Failed to receive system gesture state notification before next touch"

在日志中打印出来。有什么建议为什么会出现这个消息并且视图不能识别手势?

- (void)scaleHandler:(UIPinchGestureRecognizer *)gestureRecognizer{

CGFloat currentScale = [[[gestureRecognizer view].layer valueForKeyPath:@"transform.scale"] floatValue];
if([gestureRecognizer state] == UIGestureRecognizerStateBegan) {
    // Reset the last scale, necessary if there are multiple objects with different scales
    lastScale = [gestureRecognizer scale];
}

if ([gestureRecognizer state] == UIGestureRecognizerStateBegan ||
    [gestureRecognizer state] == UIGestureRecognizerStateChanged) {

    // Constants to adjust the max/min values of zoom
    CGFloat kMaxScale = 1.0;
    CGFloat kMinScale = 1.0;
    gestureRecognizer.view.alpha = 1/currentScale;
    if ([gestureRecognizer view] == [self.firstView view]) {
        kMaxScale = 10.0;
        kMinScale = 1.0;
        gestureRecognizer.view.alpha = 1/currentScale;
    }

    if ([gestureRecognizer view] == [self.pageView view]) {
        kMaxScale = 1.0;
        kMinScale = 0.1;
        gestureRecognizer.view.alpha = currentScale;
    }


   // NSLog(@"Current Scale is %f",[gestureRecognizer scale]);

    CGFloat newScale = 1 -  (lastScale - [gestureRecognizer scale]);
    newScale = MIN(newScale, kMaxScale / currentScale);
    newScale = MAX(newScale, kMinScale / currentScale);

    CGAffineTransform transform = CGAffineTransformScale([[gestureRecognizer view] transform], newScale, newScale);
    [gestureRecognizer view].transform = transform;

    lastScale = [gestureRecognizer scale];  // Store the previous scale factor for the next pinch gesture call
}

if([gestureRecognizer state] == UIGestureRecognizerStateEnded){

      if ([gestureRecognizer view] == [self.firstView view]) {
        if(currentScale > 1.0f){
            [self setPinchOutAnimationHidden:YES];
        }
        else{
            [self setPinchOutAnimationHidden:NO];
        }
      }
      else{
          if(currentScale < 0.9f){
              [self setPinchInAnimationToHidden:YES];
          }
          else{
              [self setPinchInAnimationToHidden:NO];
          }
      }

}

}

- (void)setPinchInAnimationToHidden: (BOOL)shouldHide{

if(shouldHide){
    NSLog(@"animation 1 - pinch in");
    [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
        CGAffineTransform transform = CGAffineTransformScale([self.pageView.view transform], 0, 0);
        self.pageView.view.transform = transform;
    } completion:^(BOOL finished){
       // [firstView.view sendSubviewToBack:pageView.view];
        NSLog(@"animation 1 - pinchin completion handler");
        [self.view insertSubview:self.pageView.view belowSubview:self.firstView.view];
        self.pageView.view.transform = CGAffineTransformMakeScale(1.0, 1.0);
        self.pageView.view.alpha = 1.0;
    }];
}
else{
      NSLog(@"animation 2- pinch in");
    [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
        self.pageView.view.transform = CGAffineTransformMakeScale(1.0, 1.0);
        self.pageView.view.alpha = 1.0;
    } completion:nil];
}
}

- (void)setPinchOutAnimationHidden: (BOOL)shouldHide{
if(shouldHide){
    NSLog(@"animation 3 - pinch out");
   // firstView = [ViewFactory firstViewController];
    [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
        CGAffineTransform transform = CGAffineTransformScale([self.firstView.view transform], 15.0, 15.0);
        self.firstView.view.transform = transform;
        self.firstView.view.alpha = 0.0;
    } completion:^(BOOL finished){
           NSLog(@"animation 3 - pinch out - completion handler");
        //[pageView.view sendSubviewToBack:firstView.view];
        [self.view insertSubview:self.firstView.view belowSubview:self.pageView.view];
        self.firstView.view.transform = CGAffineTransformMakeScale(1.0, 1.0);
        self.firstView.view.alpha = 1.0;
    }];
}
else{
     NSLog(@"animation 4- pinch out");
    [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
        self.firstView.view.transform = CGAffineTransformMakeScale(1.0, 1.0);
        self.firstView.view.alpha = 1.0;
    } completion:nil];
}
}

2
你能把手势代码贴出来让我们看看吗? - geminiCoder
修改并粘贴了我的代码。 - user2506238
嘿,你能解决这个问题吗? - Dipen Chudasama
@DipenChudasama,你能同时解决它吗? - boweidmann
@BogdanWeidmann 是的,非常感谢您的回复。 - Dipen Chudasama
@DipenChudasama,您能否友好地写下您解决此问题的方法? - boweidmann
1个回答

1
视图无法识别手势。
注册您的手势以识别状态。
UIPinchGestureRecognizer *pinchGestureRecog = [UIPinchGestureRecognizer alloc]initWithTarget:self action: @selector(scaleHandler:)];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接