将UITouch事件从superview转发到UIControl子类

时间:2014-07-28 18:13:52

标签: ios objective-c

我正在写一个放射状菜单,当你在屏幕上长按(UILongPressGestureRecognizer)时,它弹出一个按钮菜单,我可以拖动我的手指(已经触摸屏幕)按钮,选择,然后当我放手时,它执行特定于该按钮的动作。

我目前将径向菜单作为UIControl子类,我试图覆盖beginTrackingWithTouch:continueTrackingWithTouch:,但长按显示菜单(将其添加到superview) ,不会转移到UIControl识别的触摸。

任何想法我能如何"转发"这个触摸事件来自UIControl的超级视图吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

不是直接答案,但您应该真正关注今年的滚动视图的WWDC会议。然后再看一遍。它包含大量信息,而且肯定是您问题的答案。会议235:高级滚动视图和触摸处理技术。

答案 1 :(得分:1)

我会这样做......

长按处理程序:

-(IBAction)onLongPress:(UILongPressGestureRecognizer*)recognizer
{
  CGPoint point = [recognizer locationInView:self.view];
  if (recognizer.state == UIGestureRecognizerStateBegan) {
    //create the radial view and add it to the view

    CGSize radialViewSize = CGSizeMake(80, 80);
    radialView = [[RadialView alloc] initWithFrame:CGRectMake(point.x - radialViewSize.width/2, point.y - radialViewSize.height/2, radialViewSize.width, radialViewSize.height)];

    [self.view addSubview:radialView];

    radialView.backgroundColor = [UIColor redColor];

  } else if (recognizer.state == UIGestureRecognizerStateEnded) {
    [radialView onTouchUp:[radialView convertPoint:point fromView:self.view]];
    [radialView removeFromSuperview];
    radialView = nil;
  }
}

在径向视图中:(我认为径向视图将按钮保持在数组中)

-(void)onTouchUp:(CGPoint)point
{
  for (UIButton *button in buttons) {
    if ([button pointInside:[self convertPoint:point toView:button] withEvent:nil]) {
      //This button got clicked
      //send button clicked event
      [button sendActionsForControlEvents:UIControlEventTouchUpInside];
    }
  }
}

我知道它并不完美,因为触摸事件不会转发到径向视图(如您所知),但它让您点击按钮。希望它有所帮助!

答案 2 :(得分:0)

我不确定这是否与您正在寻找的行为相同,但我最近在开发Concentric Radial Menu时必须克服完全相同的问题。我很快发现的事情是,在触摸事件期间添加到视图层次结构中的视图没有经过重新测试,因此在下一个事件发生之前似乎没有响应。

我使用的解决方案,我不能说我喜欢,是实现一个拦截- (void)sendEvent:(UIEvent *)event的自定义UIWindow子类,并将这些事件转发到“活动”放射状菜单。

也就是说,菜单在激活时注册窗口,然后在卸载时取消注册。如果以原子方式完成,这实际上是一种非常安全的技术,我只是希望它比它更清洁。

祝你好运!