SwiftUI Изображение проходит через прикосновения к прозрачным пикселям - PullRequest
0 голосов
/ 19 февраля 2020

TL; DR : я хочу повторно решить в SwiftUI эту классическую c (и решаемую в UIKit) проблему: как перейти, к представлениям позади, касания в прозрачных частях. Некоторые подходы:

  1. Выясните, имеет ли точка касания альфа == 0
  2. Предоставление пути Безье к contentShape()

Например, я хочу, чтобы касания были в прозрачные части оранжевого изображения до go до зеленого изображения. Прозрачные области могут быть не связаны, как "дыры" на этих изображениях.

screen shot

Подход 1

@objc func handleTap(_ tgr: UITapGestureRecognizer) {
    let p = tgr.location(in: self)
    if pointIsOpaque(p) {
        // Handle it now.
    } else {
        // Pass it through.
    }
}

Нахождение свойства pointIsOpaque() хорошо описано в

Но оно выходит мне, как использовать это в SwiftUI - как выбрать альфа-пиксель, и как передавать события на следующий вид в z-порядке. Я предпочел бы использовать чистый SwiftUI, чем оборачивать с UIViewRepresentable.

Подход 2

Существует существующее "решение"; это поднимает столько проблем, сколько решает. Это должно обеспечить путь к View.contentShape(). Для подключенных прозрачных областей это должно быть идеально, но как рассчитать путь? Четно-нечетное правило поможет для простых несвязных областей. Но что, если прозрачная часть является набором Кантора? (JK, но это может быть сложно.)

Существует некоторая информация о расчете непрозрачной границы:

Для моего проекта я мог бы заранее рассчитать границы, используя pygame. Но выполнение прозрачного тестирования попаданий кажется более прямым.

...