Спасибо за ответы, они помогли мне решить ситуацию с видом на «Overlay».
+----------------------------+
|A +--------+ |
| |B +------------------+ |
| | |C X | |
| | +------------------+ |
| | | |
| +--------+ |
| |
+----------------------------+
Предполагается, X
- Прикосновение пользователя. pointInside:withEvent:
по телефону B
NO
, поэтому hitTest:withEvent:
A
. Я написал категорию на UIView
, чтобы справиться с проблемой, когда вам нужно получить прикосновение сверху. видно вид.
- (UIView *)overlapHitTest:(CGPoint)point withEvent:(UIEvent *)event {
// 1
if (!self.userInteractionEnabled || [self isHidden] || self.alpha == 0)
return nil;
// 2
UIView *hitView = self;
if (![self pointInside:point withEvent:event]) {
if (self.clipsToBounds) return nil;
else hitView = nil;
}
// 3
for (UIView *subview in [self.subviewsreverseObjectEnumerator]) {
CGPoint insideSubview = [self convertPoint:point toView:subview];
UIView *sview = [subview overlapHitTest:insideSubview withEvent:event];
if (sview) return sview;
}
// 4
return hitView;
}
- Мы не должны посылать событие прикосновения для скрытых или прозрачных взглядов или мнений с
userInteractionEnabled
набором для NO
;
- Если контакт находится внутри
self
, self
будет считаться потенциальным результатом.
- Проверьте рекурсивно все подзаголовки для попадания. Если есть, верните его.
- Else Самовозврат или ноль в зависимости от результата, начиная с шага 2.
Примечания, [self.subviewsreverseObjectEnumerator]
необходимого следовать вид иерархии сверху наиболее донизу. И проверьте для clipsToBounds
, чтобы убедиться в том, что вы не проверяете маскированные подзоны.
Использование:
- категории Импорт в вашем подклассы зрения.
- Заменить
hitTest:withEvent:
с этим
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
return [self overlapHitTest:point withEvent:event];
}
Official Apple's Guide обеспечивает хорошие иллюстрации тоже.
Надеюсь, это поможет кому-то.
Очень хороший учебник, который помог мне [ссылка] (http://smnh.me/ hit-testing-in-ios) – anneblue