Как переопределить hitTest, чтобы разрешить моему подпредставлению получать сенсорные события?

У меня есть UIView, который содержит другое представление, которое само содержит UIButton. Проблема в том, что MENUVIEW действительно узкое, так что мой DROPDOWN распространяется на него, и когда это происходит, и пользователь нажимает (K), ничего не происходит. Я знаю, что должен переопределить HitTest: и pointInside: но я не уверен, в каком виде и как?

Я перезаписываю hitTest в A, B или K? И указать внутри А, В или К?

Пример:

(A) is MENUVIEW, the parent of all views
(B) is DROPDOWN, a subview of MENUVIEW
(K) is UIBUTTON, a subview of DROPDOWN

Диаграмма:

    +---------------+
    |A              |         
    |               |               
    |               |         
    |               |         
    |+--------------|----------+
    ||B             |  +K---+  |
    ||              |  +----+  |
    |+--------------|----------+
    +---------------+

ОБНОВИТЬ:

Вот код, который я поместил, но он не работает. С кодом ниже я нажимаю B, затем B откроется и покажет K, но тогда K по-прежнему не активируется. Точка внутри не вызывается (A)?

    #pragma mark - Clickable Area()
    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
    {
        CGFloat radius = 200.0;
        CGRect frame = CGRectMake(self.dropDownMenu.frame.origin.x, self.dropDownMenu.frame.origin.y + 50,
                                  200,
                                  174); <-- this B's frame area minus the part of B inside A (i.e. just K and the part of B outside A)

        if (CGRectContainsPoint(frame, point)) {
            return self.dropDownMenu;
        } else {
            return [super hitTest:point withEvent:event];
        }
        return nil;
    }

    - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
    {
        if (CGRectContainsPoint(self.bounds, point)) {
            return YES;
        }
        return NO;
    }

    @end

1 ответ

Вы должны сделать достаточно большой родительский взгляд. и переопределить точку pointInside и hittest, когда точка, находящаяся вне области a|b|c, возвращает nil, чтобы позволить представлению ниже ответить на событие.(return nil означает userinteractionenabled = NO)

- (UIView *) hitTest:(CGPoint)point withEvent:(UIEvent *)event {
1.convert b's frame to the view D
if (point inside B's convertedFrame) {
    return B;
}
xxxxx {
    return A
}
XXXXX {
    return C;
}
return nil;
}

+-----------------------------+
+---------------+           D |
|A              |             |
|               |             |  
|               |             |
|               |             |
|+--------------|----------+  |
||B             |  +K---+  |  |
||              |  +----+  |  |
|+--------------|----------+  |
+---------------+             |
+-----------------------------+

если b отвечает на событие, то k может ответить, даже если k не находится внутри a.

Другие вопросы по тегам