Как переназначить прикосновение к другому окну? - PullRequest
1 голос
/ 17 октября 2019

У меня iPad с внешним сенсорным экраном. Я пытаюсь переназначить систему координат внешнего сенсорного экрана на UIWindow, который там показан.

Я получаю прикосновения к UIViewController UIWindow, который отображается на iPad,как будто я касался iPad. Я получаю их с сенсорным типом .stylus, именно так я могу отличить их от реальных касаний iPad (я покажу разные виды на iPad и на внешнем экране). Я использую следующий код:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touchesOnExternalWindow = touches.filter({ $0.type == .stylus })
    let touchesOnIpad = touches.subtracting(touchesOnExternalWindow)
    if !touchesOnIpad.isEmpty {
        super.touchesBegan(touchesOnIpad, with: event)
    }

    if !touchesOnExternalWindow.isEmpty {
        guard let externalWindow = UIApplication.shared.windows.first(where: { $0.screen.bounds == screenBounds }) else {
            fatalError("Touching the external display without an external display is not supported!")
        }

        externalWindow.rootViewController?.view.touchesBegan(touchesOnExternalWindow, with: event)
    }
}

Я пытаюсь передать прикосновения ко второму UIWindow, как если бы я касался там. Но, похоже, это не сработает.

Как программно коснуться вида? Сейчас я тестирую с кнопкой на втором экране, но она должна работать и с представлениями SceneKit.

1 Ответ

1 голос
/ 26 октября 2019

У вас может быть только один первый респондент, и он может передавать события только одному следующему респонденту. Поэтому, если вы хотите обрабатывать прикосновения со стилусом во внешнем окне, вам нужно поместить этот код внутрь вашего следующего респондента iPad UIViewController (не ясно, кто следующий респондент вашего iPad UIViewController). В следующем ответчике iPad UIViewController вы разместите этот код:

override var next: UIResponder? {
    // The next responder of The UIResponder chain.
    // It will receive responder events (like touches)
    // that current responder (your iPad window UIViewController next reponder) did't handle.
    guard let externalWindow = UIApplication.shared.windows.first(where: { $0.screen.bounds == screenBounds }) else { 
       fatalError("Touching the external display without an external display is not supported!")
     }
    return externalWindow
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touchesOnExternalWindow = touches.filter({ $0.type == .stylus })
    let touchesOnIpad = touches.subtracting(touchesOnExternalWindow)
    if !touchesOnIpad.isEmpty {
        // Here you handle your touches on iPad, instead of passing it to next responder
    }

    // Pass touches to next responder(external window).
    if !touchesOnExternalWindow.isEmpty {
        super.touchesBegan(touchesOnExternalWindow, with: event)
    }
}
...