Ответ 1
Хорошо, вот что я сделал: я создал два вида в переднем окне. Первый вид охватил область, где я хотел поймать прикосновения; второй, где я хотел, чтобы штрихи проходили. Я подклассифицировал UIWindow и переопределил метод hitTest: withEvent следующим образом:
- (UIView *) hitTest:(CGPoint)point withEvent:(UIEvent *)event {
// See if the hit is anywhere in our view hierarchy
UIView *hitTestResult = [super hitTest:point withEvent:event];
// ABKSlideupHostOverlay view covers the pass-through touch area. It recognized
// by class, here, because the window doesn't have a pointer to the actual view object.
if ([hitTestResult isKindOfClass:[ABKSlideupHostOverlayView class]]) {
// Returning nil means this window hierachy doesn't handle this event. Consequently,
// the event will be passed to the host window.
return nil;
}
return hitTestResult;
}
И в классе, который создает переднее окно, я использовал распознаватель жестов, чтобы поймать штрихи на первом представлении.
То же самое в коде 2017 года:
class PassView: UIView {}
class UIHigherWindow: UIWindow {
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
let hitView = super.hitTest(point, with: event)
if hitView!.isKind(of: PassView.self) {
return nil
}
return hitView
}
}
В вашем окне "uber" будет некоторый контроллер просмотра, UberVc.
Просто сделайте основной вид (то есть просто фон .view) UberVc - это PassView.
Затем добавьте кнопки say и т.д. на UberVc.
Приведенный выше код приводит к любым щелчкам на кнопках, идущих на UberVc, и любые клики, не входящие в кнопки (т.е. на "фон" ), переходят в ваше обычное окно/VC.