2013-03-14 54 views
0

非常好奇 - XIB中的标准四舍五入UIButton。将touchUpInside链接到视图控制器中的方法。在模拟器上它按预期工作,但在iOS 5 iPad上,在链接方法(cancelButtonPressed :)被调用之前,必须按住按钮2秒。UIButton需要2秒才能识别触摸

提取并记录该按钮的目标操作表明它确实在为正确的目标对象和方法查找touchUpInside事件。

为新的目标方法添加(in viewDidAppear)操作会产生相同的行为 - 仅当按钮按下2秒(然后释放)时才会调用新方法。它在原始方法之后立即被调用。

注意事项:这种设置当然是头发扭曲。这是浮在主屏幕上的模式视图。为了得到这里,在VC的视图被加载后,在VC和它的原始视图之间插入了一个视图。

但它当然在模拟器上效果很好。 (也可能在iOS6硬件上,虽然我还没有尝试过。)

因此,任何想法可能导致需要按住按钮2秒?按钮“动画”(瞬间变色)被触摸,所以它不是简单地长时间触摸来传播。

更多信息:操作订购

  • 创建一个相对正常的视图控制器
  • 创建一个新的UIView,使视图控制器的观点,这种新的观点,增加VC的原始视图作为一个子视图这个新查看
  • 将触摸手势识别器添加到两个视图中,以便可以识别VC原始视图之外的触摸。 (一个被添加到VC的原始视图,以便接触那里可以被忽略。)
  • 创建的UIWindow,设置为“正常窗口”
  • 设置新的窗口的根视图控制器为具有前面视图控制器
  • makeKeyAndVisible在新窗口中。

(这(几乎)成功地创建了一个 “弹出窗口” 与所选VC)

观察:

  • 按钮立即响应触摸(通过改变颜色) ,所以触摸信息过滤到视图没有延迟。
  • 按钮触摸只有在按住按钮约2秒后才有效,所以不仅仅是触摸事件被延迟发送。
  • 因此,某些东西必须影响按钮特定的逻辑来决定是否发生触摸。

啊哈!

在写这篇文章时,我想到了手势识别器可能会以某种方式参与其中。禁用它们,不再有问题。这些是UITapGestureRecognizers,并且不应该(会想到)影响按钮响应(因为在其他地方主张在盒子外面检测触摸)。 (姿势识别处理程序立即调用。)

(不,这方面的知识确实对我没啥,除了也许我可以逃脱禁止在iOS 5的“触摸外箱”功能)

+0

你是否将viewcontroller添加为childViewController? – memmons 2013-03-14 21:11:27

+0

视图控制器是UIWindow的rootViewController。 – 2013-03-14 21:29:22

+0

Hrm ...我真的需要看看你是如何设置你的视图控制器。您是从应用程序代理启动它的?这可能不算什么,但我猜测这与你的视图/控制器层次结构有关。 – memmons 2013-03-14 23:57:20

回答

2

这样做是为了避免它在iOS5中:

- (void)tappedAction:(UIGestureRecognizer *)sender { 
    float version = [[[UIDevice currentDevice] systemVersion] floatValue]; 
    if (version < 6.0) { 
     CGPoint pt = [sender locationInView:_button]; 
     NSLog(@"%@", NSStringFromCGPoint(pt)); 
     if (CGRectContainsPoint(_button.bounds, pt)) { 
      [self buttonAction:_button]; 
      return; 
     } 
    }   
    // do some Tapped Action 
    NSLog(@"tappedAction:"); 
}