1

Ich habe eine CustomPresentationController, animiert in und out mit benutzerdefinierten Animationen;iOS - Dismiss präsentiert Ansicht Controller berühren außerhalb seiner Ansicht

Dieser spezielle Controller wird präsentiert, mehr weniger bei 50% der Bildschirmgröße, und wenn ich es präsentiere, füge ich dem presentingViewController eine schattengraue Ansicht hinzu, so dass es etwas Tiefe hinzufügt.

kann ich entlassen nur die presentedViewController wenn ich die cancel Taste in der NavBar tippen, die ich die Standard-dismiss(:) Methode aufrufen.

Was ich versuche zu erreichen, einen Hahn außerhalb der presentedViewController zu erkennen, vielleicht innerhalb der Grauzone, so kann ich die presentedViewController, irgendwie entlassen wie ein ActionSheet entlassen, aber ich habe versäumt, es zu tun. Lassen Sie mich erklären, was ich bisher versucht habe.

Ich habe versucht, eine UITapGestureRecognizer zur Schatten-Grau-Ansicht hinzuzufügen, aber da ich einen anderen Controller präsentiere, könnte die App-Engine denken, dass die Schatten-Ansicht nicht auf der obersten Hierarchieansicht ist möglicherweise nicht zugänglich Es blockiert also den Erkenner - wenn ich ihn antippen, werden die Gestengriffe nicht ausgelöst.

Ich implementiere jetzt zusätzlich ein Wischen nach unten, um zu entlassen, was ich leicht machen kann, aber ich wollte wirklich die Tipp-außerhalb-Funktion auch funktionieren.

Irgendein Hinweis, wie kann ich das angehen?

Die apps Bild ist folgende:

screenshot

Antwort

1

Ich musste das nur in einer meiner App implementieren.

Ich machte es funktioniert, indem Sie eine Schaltfläche hinzufügen, die die gesamte Ansicht abdeckt und diese Schaltfläche, einmal angeklopft löst die VC, um abgewiesen werden.

Sobald die Schaltfläche hinzugefügt ist, können Sie Ihre benutzerdefinierte Ansicht oben hinzufügen.

Bis jetzt sieht es so aus, als ob es ziemlich gut funktioniert.

Mein Code (Ich mache alles programmatisch, kein Drehbuch)

//————————————————————————————— 
    // MARK: View Life Cycle 
    //————————————————————————————— 

override func viewDidLoad() { 
    super.viewDidLoad() 
    view.backgroundColor = UIColor.clear //VC view background transparent 
    setupUI() 
} 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    //Animate blackView opacity to 1 to give some depth 
    UIView.animate(withDuration: 0.4, delay: 0.2, options: .curveEaseInOut, animations: { 
     self.blackView.alpha = 1 
    }) 
} 

    //———————————————— 
    // MARK: Setup UI 
    //———————————————— 

    let blackView: UIView = { 
     let view = UIView() 
     view.alpha = 0.0 
     view.backgroundColor = UIColor.black.withAlphaComponent(0.6) 
     return view 
    }() 
    //Invisible button which covers the entire view that can be tapped 
    lazy var dismissLayerBtn: UIButton = { 
     let btn = UIButton() 
     btn.addTarget(self, action: #selector(tapToDismiss), for: .touchUpInside) 
     return btn 
    }() 

    @objc func tapToDismiss() { 
     print("tapToDimiss") 
     self.dismiss(animated: true, completion: nil) 
    } 

    let milestonePickerView: MilestonePickerView = { 
     let view = MilestonePickerView(frame: .zero) 
     return view 
    }() 

    func setupUI() { 

     view.addSubview(blackView) 
     view.addSubview(dismissLayerBtn) 
     view.addSubview(milestonePickerView) //Important to add the customView after the button. 

     blackView.anchor(top: view.topAnchor, left: view.leftAnchor, bottom: view.bottomAnchor, right: view.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0) 

     dismissLayerBtn.anchor(top: view.topAnchor, left: view.leftAnchor, bottom: view.bottomAnchor, right: view.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0) 

     milestonePickerView.anchor(top: nil, left: view.leftAnchor, bottom: view.bottomAnchor, right: view.rightAnchor, paddingTop: 0, paddingLeft: 20, paddingBottom: 40, paddingRight: 20, width: 0, height: 400) 

//I'm using a custom extension to setup constraints (anchors) 
    } 

Wenn Sie Storyboard verwenden, stellen Sie sicher, dass Sie die unsichtbare Schaltfläche unter der benutzerdefinierten Ansicht setzen.

Ich hoffe, das hilft.

1

Sie waren auf dem richtigen Weg mit dem UITapGestureRecognizer. So stellen Sie sicher, dass Sie die shouldRecognizeSimultaneouslyWith als solche implementieren:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
    return true 
} 

Dies ist die Geste richtig Feuer ermöglichen soll.

+0

hmm ... Ich habe diese Eigenschaft nie benutzt, das könnte der Grund sein, warum ich das nicht herausfinden konnte: D Ich werde es versuchen und ich werde dir Feedback geben –

+0

Es hat nicht funktioniert. Wenn diese Eigenschaft gesetzt wird, wird die Gestenerkennung niemals ausgelöst. Es könnte sein, dass die Ansicht für den Benutzer nicht verfügbar ist, da sie nicht in der Hierarchie der obersten Ansicht ist. Es sollte eine Möglichkeit geben, Berührungen irgendwo auf dem Bildschirm unabhängig von der dargestellten Ansicht zu erkennen, dann würde ich prüfen, ob der Berührungsort über dem angezeigten Popup lag, dann wusste ich, wann zu entlassen war –

0

mit meinem Code unten Versuchen:

Sie müssen diese Methode implementieren innerhalb Sie Controller vorgestellt, die Sie mit als Popup arbeiten.

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    // Here write down you logic to dismiss controller  
} 

Hoffe, das wird funktionieren. : D

+0

Es hat nicht funktioniert. Da meine Popup-Ansicht vom Typ 'UICollectionView' ist, musste ich die' collectionView? .isUserInteractionEnabled = false' setzen, um Berührungen zu erkennen, aber selbst wenn Berührungen erkannt werden, erkennt es nicht, ob Berührungen im Schatten waren. Wenn ich den Schattenbereich berühre, feuert es nicht die 'touches (:)' Methode –

Verwandte Themen