TL; DR : я хочу повторно решить в SwiftUI эту классическую c (и решаемую в UIKit) проблему: как перейти, к представлениям позади, касания в прозрачных частях. Некоторые подходы:
- Выясните, имеет ли точка касания альфа == 0
- Предоставление пути Безье к
contentShape()
Например, я хочу, чтобы касания были в прозрачные части оранжевого изображения до go до зеленого изображения. Прозрачные области могут быть не связаны, как "дыры" на этих изображениях.
Подход 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
. Но выполнение прозрачного тестирования попаданий кажется более прямым.