İOS 13'te sunulan görünüm denetleyicisinin etkileşimli olarak kapatılmasını devre dışı bırakın


135

iOS 13 , modlu olarak sunulan görünüm denetleyicileri için yeni bir tasarım modalPresentationStyle .pageSheet(ve onun kardeşini .formSheet) sunar ...

İOS 13'teki yeni sürgülü modal sunum

… Ve sunulan görünüm denetleyicisini aşağı kaydırarak (etkileşimli kapatma ) bu sayfaları kapatabiliriz . Yeni "reddetmek için çekin" özelliği oldukça kullanışlı olsa da, her zaman arzu edilmeyebilir.

SORU: Etkileşimli işten çıkarmayı nasıl kapatabiliriz? - Sunum tarzını aynı tuttuğumuzu unutmayın.


4
İOS

6
@MehulThakkar Bu farklı bir soru.
Jakub Truhlář

Yanıtlar:


241

Seçenek 1:

viewController.isModalInPresentation = true

Engelli etkileşimli işten çıkarma

(Devre dışı bırakılan etkileşimli .pageSheetişten çıkarma, bunun gibi davranır.)

  • İOS 13 olduğundan, etkileşimli kapatmayı önlemek için ayarlanması gereken UIViewControlleryeni bir özellik içerir .isModalInPresentationtrue
  • Temel olarak, görünüm denetleyicisinin sınırları dışındaki olayları yok sayar. Yalnızca otomatik stili değil, aynı zamanda .popovervb. Sunum stillerini de kullanıyorsanız bunu aklınızda bulundurun .
  • Bu özellik falsevarsayılan olarak.

Gönderen resmi dokümanlar : If trueit ekrandaki iken, UIKit görünümü kontrolörün sınırları ve engeller dışında görünümü denetleyicisi etkileşimli görevden olaylarını dikkate almaz.


Seçenek 2:

func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
    return false
}
  • IOS 13, UIAdaptivePresentationControllerDelegateadlı yeni bir yöntem içerir presentationControllerShouldDismiss.
  • Bu yöntem, yalnızca sunulan görünüm denetleyicisi program aracılığıyla kapatılmadıysa ve isModalInPresentationözelliği olarak ayarlandıysa çağrılır false.

İpucu: PresentationController'ın temsilcisini atamayı unutmayın.


2
Sunulan görünüm denetleyicisi bir gezinme denetleyicisiyse, isModalInPresentationgezinme denetleyicisinde veya gezinme yığınında gösterilen bağımsız görünüm denetleyicilerinde ayarlama yapabilirsiniz . İkincisi, etkileşimli kapatmanın mümkün olup olmadığını ekran bazında seçmenize olanak tanır. Arama denetleyicilerine dikkat ederek, bunlar bireysel görünüm denetleyicisine göre önceliklidir (ancak gezinme denetleyicisine göre değil). Blog gönderimde daha fazla bilgi: medium.com/@hacknicity/…
Geoff Hackworth

1
Bunun dışında dokunarak zaman görevden alındıktan adresinin VC popover olarak sunulursa, bu popover önleyecektir unutmayın
PatrickDotStar

4
Objective-C:viewController.modalInPresentation = YES;
quarac

3
Bu bayrağı bir üzerine ayarlarken bunu çalıştıran var UIImagePickerControllermı? Bizim için UIImagePickerController, bunu görmezden geliyor gibi görünüyor ve bu yüzden kaydırma hareketiyle kapatılabilir. Belki bir iOS 13 hatasıdır.
PatrickDotStar

4
Ne zaman presentationControllerShouldDismiss(_ presentationController: UIPresentationController)döner sahte, presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController)bunu yapabilirsiniz denir şeyler kullanıcı verilerini girmiş eğer bir onay diyalogu eklemek gibi.
Neil

66
  1. Önceki iOS sürümündeki (<iOS13) tam ekranda model sunumu gibi aynı davranışı istiyorsanız, hedef görünüm denetleyicinizin sunum stilini şu şekilde ayarlayın: UIModalPresentationStyle.fullScreen

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

    Ve film şeridi kullanıyorsanız, sadece segmenti seçin Full Screenve Presentationaçılır listeden seçin.

    görüntü açıklamasını buraya girin

  2. Sadece etkileşimli kapatmayı devre dışı bırakmak ve yeni sunum stili set UIViewControllerözelliğini isModalInPresentationolarak tutmak istiyorsanız true.

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

{Controller.isModalInPresentation = true} kullanmaktan daha iyi çalışır.
Maxim Firsoff

8

Mülk isModalInPresentationyardımcı olabilir.

Belgelerden:

Bunu olarak ayarladığınızda true, UIKit, görünüm denetleyicisinin sınırları dışındaki olayları yok sayar ve ekrandaki görüntü denetleyicisinin etkileşimli olarak kapatılmasını önler.

Bunu şu şekilde kullanabilirsiniz:

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

5

Kullanıcı arayüzünüzü düzenlemek için hikaye tahtaları kullanıyorsanız, bir gezinme denetleyicisi kullanırken bu etkileşimli kapatmayı devre dışı bırakmanın en iyi yolunu, öznitelik denetçisindeki Gezinme Denetleyicisinin sunumunu Otomatik'ten Tam Ekrana değiştirmek olduğunu buldum. Gezinme yığınınızdaki tüm görünüm denetleyicileri tam ekran olacak ve kullanıcı tarafından kapatılamayacaktır.

Gezinme denetleyicisi için sunum seçeneğini gösteren Özellik Denetçisi


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.