Как переопределить 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.