iOS 13에서 제시된 뷰 컨트롤러의 대화 형 해제 비활성화


135

iOS 13 은 모달로 제공되는 뷰 컨트롤러를위한 새로운 디자인 modalPresentationStyle .pageSheet(및 그 형제 .formSheet)을 도입했습니다 .

iOS 13의 새로운 슬라이딩 모달 프레젠테이션

… 그리고 제시된 뷰 컨트롤러를 아래로 밀어서이 시트를 닫을 수 있습니다 (대화식 닫힘) . 새로운 "pull-to-dismiss"기능은 매우 유용하지만 항상 바람직한 것은 아닙니다.

질문 : 대화 형 해고를 어떻게 끌 수 있습니까? -프레젠테이션 스타일은 동일하게 유지됩니다.



6
@MehulThakkar 그건 다른 질문입니다.
Jakub Truhlář 2019 년

답변:


240

옵션 1:

viewController.isModalInPresentation = true

대화식 해고 비활성화

(비활성화 된 대화 형 .pageSheet해고는 이와 같이 작동합니다.)

  • iOS 13부터는 대화 형 해제를 방지하기 위해 로 설정해야하는 UIViewController새 속성이 포함되어 있습니다 .isModalInPresentationtrue
  • 기본적으로 뷰 컨트롤러의 경계를 벗어난 이벤트를 무시합니다. 자동 스타일뿐만 아니라 프레젠테이션 스타일 .popover등을 사용하는 경우 유의하십시오 .
  • 이 속성은 false기본적으로 사용됩니다.

로부터 공식 문서 : 만약 true이 화면에있는 동안, UIKit은 뷰 컨트롤러의 경계 및 방지 외부 뷰 컨트롤러의 상호 작용 해고 이벤트를 무시합니다.


옵션 2 :

func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
    return false
}
  • 아이폰 OS (13) 때문에, UIAdaptivePresentationControllerDelegate라고하는 새로운 방법을 포함 presentationControllerShouldDismiss.
  • 이 메서드는 제공된 뷰 컨트롤러가 프로그래밍 방식으로 해제되지 않고 isModalInPresentation속성이로 설정된 경우에만 호출됩니다 false.

팁 : presentationController의 델리게이트를 지정하는 것을 잊지 마십시오.


2
제시된보기 컨트롤러가 탐색 컨트롤러 인 isModalInPresentation경우 탐색 컨트롤러 또는 탐색 스택에 표시된 개별보기 컨트롤러에서 설정할 수 있습니다 . 후자는 대화 형 해고가 가능한지 화면별로 선택할 수 있습니다. 검색 컨트롤러를 사용하는 경우에는 개별 뷰 컨트롤러보다 우선합니다 (탐색 컨트롤러는 아님). 내 블로그 게시물에서 더 많은 정보 : medium.com/@hacknicity/…
Geoff

1
VC가 팝 오버로 표시되는 경우 외부를
탭할

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

3
누구든지이 플래그를 설정할 때 작동하도록했습니다. UIImagePickerController? 우리에게는이 ( UIImagePickerController가) 무시 하는 것처럼 보이 므로 스 와이프 동작으로 해제 할 수 있습니다. 아마도 iOS 13 버그 일 수 있습니다.
PatrickDotStar 2010 년

4
presentationControllerShouldDismiss(_ presentationController: UIPresentationController)false를 반환 할 때 presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController)사용자가 데이터를 입력 한 경우 확인 대화 상자를 추가하는 등의 작업을 수행 할 수 있도록 호출됩니다.
Neil

66
  1. 전체 화면의 모델 프리젠 테이션과 같이 이전 iOS 버전 (<iOS13)에서와 동일한 동작을 원하면 대상 뷰 컨트롤러의 프리젠 테이션 스타일을 다음으로 설정하십시오. UIModalPresentationStyle.fullScreen

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

    스토리 보드를 사용하는 경우 segua를 선택 Full Screen하고 Presentation드롭 다운 에서 선택하십시오.

    여기에 이미지 설명 입력

  2. 대화 형 해제를 비활성화하고 새 프레젠테이션 스타일 설정 UIViewController속성 isModalInPresentationtrue.

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

{controller.isModalInPresentation = true}를 사용하는 것보다 더 잘 작동합니다.
Maxim Firsoff

8

숙소 isModalInPresentation가 도움 이 될 수 있습니다.

문서에서 :

로 설정하면 trueUIKit은 뷰 컨트롤러의 경계를 벗어난 이벤트를 무시하고 화면에있는 동안 뷰 컨트롤러의 대화 형 해제를 방지합니다.

다음과 같이 사용할 수 있습니다.

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

5

스토리 보드를 사용하여 UI를 레이아웃하는 경우 탐색 컨트롤러를 사용할 때이 대화 형 해제를 비활성화하는 가장 좋은 방법은 속성 검사기에서 탐색 컨트롤러의 표시를 자동에서 전체 화면으로 변경하는 것입니다. 그러면 내비게이션 스택의 모든보기 컨트롤러가 전체 화면이되고 사용자가 닫을 수 없습니다.

내비게이션 컨트롤러의 프레젠테이션 옵션을 보여주는 속성 검사기


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.