0

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.

Antwort

0

Es stellte sich heraus, dass das Problem nicht darin bestand, einen Verweis auf die View zu verwalten, die meine maskView enthielt. In dem Viewcontroller, der diese Ansicht erstellt änderte ich meine showPopUp() Funktion wie folgt:

// Stored property on my View Controller class 
var myPopupView: UIView? 

private func showLMBFormSubmittedPopup(){ 
    let popupView = MyPopupView() 
    popupView.show() 

    // Once I added this line, it started working 
    myPopupView = popupView 
} 

Vielleicht hat jemand etwas Licht könnte, warum dies geschieht. Ich vermute, dass ARC den Speicher freigibt, den mein UITapGestureRecognizer belegt, weil mein Code nicht mehr darauf verweist.

0

Da Ihre Hintergrundansicht die gleiche Größe wie die Superansicht haben soll, können Sie versuchen, die Rahmengröße festzulegen, anstatt Einschränkungen zu verwenden.

let backgroundView = UIView(frame: applicationKeyWindow.frame)

, die für mich in der Vergangenheit in einer ähnlichen Situation gearbeitet hat.

Ich hoffe, das hilft! Einen schönen Tag noch!

+0

Leider kann ich die Berührungen immer noch nicht erhalten. Scheint nichts zu ändern ... – toddg

+0

Ich weiß, es scheint seltsam, aber Sie könnten versuchen, die Einschränkungen zu aktivieren, bevor Sie die Gestenerkennung anwenden. – KGJ

+0

Ich benutzte die UIScreen Fenstergrenzen 'UIView (frame: UIScreen.main.bounds)' – KGJ

Verwandte Themen