Ich versuche eine (Hintergrund-) Maskenansicht zum vordersten Fenster in meiner iOS App hinzuzufügen. In dieser Maskenansicht möchte ich einen UITapGestureRecognizer hinzufügen, der die Maskenansicht verwirft. Letztendlich möchte ich ein Popup in der Mitte anzeigen (d. H. Meine Maskenansicht ist ein verblasster Hintergrund für das Popup), aber im Moment habe ich nur Schwierigkeiten, meinen Hintergrund wie erwartet zu schließen.Frontal UIView mit TapGestureRecognizer empfängt keine Berührungen
Der Code sieht so aus: Ich bekomme das vorderste Fenster. Ich erstelle die Hintergrundansicht und füge Alpha hinzu. Dann füge ich meinen Gestenerkenner hinzu, füge ihn dem Fenster hinzu und füge Einschränkungen hinzu.
Allerdings wird mein Tipp Gestenziel didTapOnMaskView()
nie ausgelöst.
private func createMaskView() {
let applicationKeyWindow = UIApplication.shared.windows.last
backgroundView = UIView()
backgroundView.translatesAutoresizingMaskIntoConstraints = false
backgroundView.backgroundColor = UIColor(white: 0, alpha: 0.2)
backgroundDismissGesture = UITapGestureRecognizer(target: self, action: #selector(didTapOnMaskView))
backgroundDismissGesture.numberOfTapsRequired = 1
backgroundDismissGesture.cancelsTouchesInView = false;
backgroundView.addGestureRecognizer(backgroundDismissGesture)
backgroundView.isUserInteractionEnabled = true
backgroundView.alpha = 0.0
UIView.animate(withDuration: 0.4) {
self.backgroundView.alpha = 1.0
}
applicationKeyWindow.addSubview(backgroundView)
let views: [String: UIView] = [ "backgroundView": backgroundView]
var allConstraints = [NSLayoutConstraint]()
let verticalConstraint = NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[backgroundView]-0-|", options: [], metrics: nil, views: views)
allConstraints += verticalConstraint
let horizontalConstraint = NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[backgroundView]-0-|", options: [], metrics: nil, views: views)
allConstraints += horizontalConstraint
NSLayoutConstraint.activate(allConstraints)
// This is super odd, but the gesture gets triggered until the following code block executes
DispatchQueue.main.asyncAfter(deadline: .now() + 3.1) {
applicationKeyWindow.bringSubview(toFront: self.backgroundView)
}
}
func didTapOnMaskView() {
hide()
}
func show(){
createMaskView()
}
** EDIT ** Nachdem einige weitere Diagnose ausgeführt wird, habe ich bemerkt, dass, wenn ich hinzufügen, einen Drei-Sekunden-Verzögerung Codeblock bis zum Ende meines createMaskView()
, die die maskView nach vorne bringen, Die Geste funktioniert für die ersten 3,1 Sekunden, bis dieser Codeblock ausgeführt wird. Beachten Sie, dass der Gestenerkenner überhaupt nicht funktioniert (nicht einmal 3,1 Sekunden), wenn dieser Codeblock nicht vorhanden ist.
Leider kann ich die Berührungen immer noch nicht erhalten. Scheint nichts zu ändern ... – toddg
Ich weiß, es scheint seltsam, aber Sie könnten versuchen, die Einschränkungen zu aktivieren, bevor Sie die Gestenerkennung anwenden. – KGJ
Ich benutzte die UIScreen Fenstergrenzen 'UIView (frame: UIScreen.main.bounds)' – KGJ