Deaktivieren Sie die interaktive Entlassung des dargestellten Ansichtscontrollers in iOS 13


133

iOS 13 stellt ein neues Design von modalPresentationStyle .pageSheet(und seinen Geschwistern .formSheet) für modal präsentierte View Controller vor…

Die neue verschiebbare modale Präsentation in iOS 13

… Und wir können diese Blätter schließen, indem wir den dargestellten Ansichts-Controller nach unten schieben (interaktive Entlassung) . Obwohl die neue Funktion "Pull-to-Discharge" ziemlich nützlich ist, ist sie möglicherweise nicht immer wünschenswert.

DIE FRAGE: Wie können wir die interaktive Entlassung ausschalten? - Denken Sie daran, dass wir den Präsentationsstil beibehalten.



6
@MehulThakkar Das ist eine andere Frage.
Jakub Truhlář

Antworten:


239

Option 1:

viewController.isModalInPresentation = true

Interaktive Entlassung deaktiviert

(Deaktivierte interaktive .pageSheetEntlassung verhält sich so.)

  • Seit iOS 13 UIViewControllerenthält eine neue Eigenschaft namens, isModalInPresentationdie festgelegt werden muss true, um die interaktive Entlassung zu verhindern.
  • Grundsätzlich werden Ereignisse außerhalb der Grenzen des View Controllers ignoriert. Denken Sie daran, wenn Sie nicht nur den automatischen Stil verwenden, sondern auch Präsentationsstile wie .popoverusw.
  • Diese Eigenschaft ist falsestandardmäßig.

Aus den offiziellen Dokumenten : Wenn true, ignoriert UIKit Ereignisse außerhalb der Grenzen des View Controllers und verhindert das interaktive Schließen des View Controllers, während dieser auf dem Bildschirm angezeigt wird.


Option 2:

func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
    return false
}
  • Seit iOS 13 UIAdaptivePresentationControllerDelegateenthält eine neue Methode namens presentationControllerShouldDismiss.
  • Diese Methode wird nur aufgerufen, wenn der dargestellte Ansichtscontroller nicht programmgesteuert geschlossen und seine isModalInPresentationEigenschaft auf gesetzt ist false.

Tipp: Vergessen Sie nicht, den Delegierten von PresentationController zuzuweisen.


2
Wenn der dargestellte Ansichtscontroller ein Navigationscontroller ist, können Sie ihn entweder isModalInPresentationauf dem Navigationscontroller oder auf den einzelnen im Navigationsstapel angezeigten Ansichtscontrollern einstellen . Mit letzterem können Sie Bildschirm für Bildschirm auswählen, ob die interaktive Entlassung möglich ist. Bei Suchsteuerungen haben sie Vorrang vor den einzelnen Ansichtssteuerungen (jedoch nicht vor der Navigationssteuerung). Weitere Informationen in meinem Blog-Beitrag: medium.com/@hacknicity/…
Geoff Hackworth

1
Denken Sie daran, dass, wenn Ihr VC als Popover angezeigt wird, dies verhindert, dass das Popover beim Tippen außerhalb des
Popovers geschlossen wird

4
Ziel-C:viewController.modalInPresentation = YES;
Quarac

3
Hat jemand das zum Laufen gebracht, als er dieses Flag auf ein gesetzt hat UIImagePickerController? Für uns sieht es so aus, als würde der UIImagePickerControlleres ignorieren und so kann es mit der Wischgeste verworfen werden. Vielleicht ist es ein iOS 13-Fehler.
PatrickDotStar

4
Wenn presentationControllerShouldDismiss(_ presentationController: UIPresentationController)false zurückgegeben wird, presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController)wird aufgerufen, damit Sie beispielsweise einen Bestätigungsdialog hinzufügen können, wenn der Benutzer Daten eingegeben hat.
Neil

66
  1. Wenn Sie dasselbe Verhalten wie in der vorherigen iOS-Version (<iOS13) wie bei der Modellpräsentation im Vollbildmodus wünschen, stellen Sie einfach den Präsentationsstil Ihres Zielansichts-Controllers auf ein UIModalPresentationStyle.fullScreen

    let someViewController = \*VIEW CONTROLLER*\
    someViewController.modalPresentationStyle = .fullScreen

    Und wenn Sie ein Storyboard verwenden, wählen Sie einfach das Segua und dann Full Screendas PresentationDropdown-Formular aus.

    Geben Sie hier die Bildbeschreibung ein

  2. Wenn Sie nur die interaktive Entlassung deaktivieren und die UIViewControllerEigenschaft isModalInPresentationfür den neuen Präsentationsstil beibehalten möchten true.

    if #available(iOS 13.0, *) {
        someViewController.isModalInPresentation = true // available in IOS13
    }

Es funktioniert besser als die Verwendung von {controller.isModalInPresentation = true}.
Maxim Firsoff

8

Die Eigenschaft isModalInPresentationkönnte helfen.

Aus der Dokumentation:

Wenn Sie dies truefestlegen, ignoriert UIKit Ereignisse außerhalb der Grenzen des Ansichtscontrollers und verhindert das interaktive Schließen des Ansichtscontrollers, während dieser auf dem Bildschirm angezeigt wird.

Sie können es so verwenden:

let controller = MyViewController()
controller.isModalInPresentation = true
self.present(controller, animated: true, completion: nil)

5

Wenn Sie Storyboards zum Layout Ihrer Benutzeroberfläche verwenden, habe ich festgestellt, dass die interaktive Entlassung bei Verwendung eines Navigationscontrollers am besten deaktiviert werden kann, indem die Darstellung des Navigationscontrollers im Attributinspektor von Automatisch auf Vollbild geändert wird. Alle View Controller in Ihrem Navigationsstapel werden dann im Vollbildmodus angezeigt und können vom Benutzer nicht geschlossen werden.

Attributinspektor mit Präsentationsoption für den Navigationscontroller


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.