草庐IT

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

coder 2023-07-26 原文

我有一个控件可以在一个 View 中交替切换两个 View 。即,在容器 View 中通过 subview 方法添加了两个 View Controller 。双指张开手势放大当前 View ,并显示第二个 View 。如果想转到上一个 View ,捏出手势即可。问题是, View 有时并不总是对 gusture 和消息使用react

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

在日志中打印出来。有什么建议为什么会出现此消息并且 View 无法识别该手势吗?

- (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];
}
}

最佳答案

view doesn't recogonize the gesture

注册您的手势以识别状态

UIPinchGestureRecognizer *pinchGestureRecog = [UIPinchGestureRecognizer alloc]initWithTarget:self action: @selector(scaleHandler:)];

关于ios - 下一次触摸前未能收到系统手势状态通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19765012/

有关ios - 下一次触摸前未能收到系统手势状态通知的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  3. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  4. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  5. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  6. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  7. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

  8. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  9. ruby-on-rails - 我更新了 ruby​​ gems,现在到处都收到解析树错误和弃用警告! - 2

    简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und

  10. ruby-on-rails - 如何在发布新的 Ruby 或 Rails 版本时收到通知? - 2

    有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:

随机推荐