仅将触摸事件转发到被触摸的视图

时间:2011-12-02 13:05:00

标签: ios cocoa-touch hittest touch-event

我有一个带有文本字段,按钮和表格的UIWindow。 我希望能够跟踪屏幕上的所有触摸,然后将它们转发到被触摸的元素。

我已阅读Apple documentation中覆盖sendEvent的内容,但我仍然不明白:

  1. 如何使用hitTest检索被触摸的元素
  2. 如何转发
  3. 这是我到目前为止所做的。

    - (void) sendEvent:(UIEvent *)event
    {
    
        for (UITouch *touch in [event allTouches])
        {
            /* Get coordinates of touch */
            CGPoint point = [touch locationInView:self];
    
            /* Get subview being touched */
            /* something like this???
               UIView *receiver = [self hitTest:point withEvent:event];            
             */
    
            /* Forward touch event to right view */
            /* how??? */
    
        }
    
        [super sendEvent:(UIEvent *)event];
    }
    

    谢谢。

1 个答案:

答案 0 :(得分:2)

我不确定这是最好的解决方案,但我关注的是here已发布的内容。

基本上我有一个UIView的子类覆盖整个空间。这样的类包含对所有可触摸元素的引用。 (我希望有办法避免这种情况)

这是标题中的代码

 @interface SubclassUIView : UIView {       
    UITextField *text;
    UITableView *table;
    UIButton        *button;
    UIToolbar       *toolbar;
}

这是实施:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    CGPoint tableHit = [table convertPoint:point fromView:self];
    CGPoint buttonHit = [button convertPoint:point fromView:self];
    CGPoint toolbarHit = [toolbar convertPoint:point fromView:self];
    CGPoint messageHit = [text convertPoint:point fromView:self];

    if ([table pointInside:tViewHit withEvent:event]) return table;
    else if ([button pointInside:buttonHit withEvent:event]) return button;
    else if ([toolbar pointInside:toolbarHit withEvent:event]) return toolbar;
    else if ([text pointInside:messageHit withEvent:event]) return text;

    return [super hitTest:point withEvent:event];
}