SwiftUI UIView с наложением отменяет касание - PullRequest
1 голос
/ 16 марта 2020

Я застрял в этой проблеме с пользовательским интерфейсом, работая с SwiftUI и UIView.

По сути, оверлей останавливает взаимодействие с пользователем, чтобы выполнить UIView.

Button(action: { print("hello") }){ Text("HERE") }
.overlay(
           LinearGradient(
               gradient: Gradient(colors: [.clear, Color.black.opacity(0.3)]),
               startPoint: .top,
               endPoint: .bottom
            ).allowsHitTesting(false))

Не работает с UIView

struct ButtonView: UIViewRepresentable {

    func makeUIView(context: Context) -> UIButton {
        return UIButton(type: .close)
    }

    func updateUIView(_ uiView: UIButton, context: Context) {

    }
}

ButtonView()
.overlay(
           LinearGradient(
               gradient: Gradient(colors: [.clear, Color.black.opacity(0.3)]),
               startPoint: .top,
               endPoint: .bottom
            ).allowsHitTesting(false))

У кого-нибудь возникают такие же проблемы? Спасибо!

1 Ответ

0 голосов
/ 17 марта 2020

Я исследовал несколько путей, но не смог пройти оверлей через тест на попадание. Я думаю, что это ошибка. Однако я получил этот обходной путь, работающий с:

struct ButtonView: UIViewRepresentable {

let button = UIButton(type: .close)
func makeUIView(context: Context) -> UIButton { return button }
func updateUIView(_ uiView: UIButton, context: Context) { }
func makeCoordinator() -> Coordinator { Coordinator(self) }

class Coordinator: NSObject {
    var parent: ButtonView
    var count = 0

    init(_ uiView: ButtonView) {
        self.parent = uiView
        super.init()
        self.parent.button.addTarget(self, action: #selector(clickAction(_:)), for: .touchUpInside)
    }

    @objc func clickAction(_ sender: UIButton) {
        print("---> clicked on button \(count)")
        count += 1
    }
}
}

и

let buttonView = ButtonView()
var body: some View {
    buttonView
        .overlay(LinearGradient(
            gradient: Gradient(colors: [.clear, Color.black.opacity(0.3)]),
            startPoint: .top,
            endPoint: .bottom
            ).onTapGesture { self.buttonView.button.sendActions(for: .touchUpInside)   })

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...