在下次触摸之前无法接收系统手势状态通知
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在下次触摸之前无法接收系统手势状态通知相关的知识,希望对你有一定的参考价值。
我有一个控件,可以在视图中交替切换两个视图。即,在容器视图中通过子视图方法添加两个视图控制器。缩小gusture缩放当前视图,并显示第二个视图。如果希望转到上一个视图,那么一个捏出来的风就会这样做。问题是,视图doest不会对gusture做出反应,有时并不总是和meessage "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];
}
}
答案
视图无法识别手势
注册您的手势以识别状态
UIPinchGestureRecognizer *pinchGuestureRecog = [UIPinchGestureRecognizer alloc]initWithTarget:self action: @selector(scaleHandler:)];
以上是关于在下次触摸之前无法接收系统手势状态通知的主要内容,如果未能解决你的问题,请参考以下文章
通过Swift中的触摸检测应用程序何时处于活动状态或非活动状态[重复]