programing

표시된 뷰 컨트롤러의 대화형 삭제 사용 안 함

newnotes 2023. 4. 20. 22:42
반응형

표시된 뷰 컨트롤러의 대화형 삭제 사용 안 함

iOS 13은 새로운 디자인의modalPresentationStyle .pageSheet(그리고 그 형제자매).formSheet모듈러로 표시되는 뷰 컨트롤러의 경우...

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

...또한 표시된 뷰 컨트롤러를 아래로 슬라이드하여 이러한 시트를 제거할 수 있습니다(순차적 삭제).새로운 "풀 투 디스미스" 기능은 매우 유용하지만 항상 바람직한 것은 아닙니다.

질문: 어떻게 하면 인터랙티브한 해고를 끌 수 있을까요?- 프레젠테이션 스타일은 그대로 유지한다는 점을 명심하십시오.

옵션 1:

viewController.isModalInPresentation = true

인터랙티브 해고를 무효로 하다

(디세이블 인터랙티브).pageSheet해고는 이렇게 행동합니다.)

  • iOS 13 이후로UIViewController라고 하는 새로운 속성이 포함되어 있습니다.isModalInPresentation로 설정해야 합니다.true인터랙티브 해고를 막기 위해서입니다.
  • 기본적으로 뷰 컨트롤러의 범위를 벗어나는 이벤트는 무시됩니다.자동 스타일뿐만 아니라 다음과 같은 프레젠테이션 스타일도 사용할 경우 유의하십시오..popover기타.
  • 이 속성은false디폴트입니다.

공식 문서:한다면true, UIKit 는 뷰 컨트롤러의 범위를 벗어나는 이벤트를 무시하고 뷰 컨트롤러가 화면상에 있는 동안 대화식으로 해제되는 것을 방지합니다.


옵션 2:

func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
    return false
}
  • iOS 13 이후로UIAdaptivePresentationControllerDelegate라고 하는 새로운 메서드가 포함되어 있습니다.presentationControllerShouldDismiss.
  • 이 메서드는 표시된 뷰 컨트롤러가 프로그래밍 방식으로 해제되지 않고 해당 컨트롤러가 해제된 경우에만 호출된 경우에만 호출됩니다.isModalInPresentation속성이 로 설정됩니다.false.

힌트: 할당하는 것을 잊지 마세요.presentationController의 대표자하지만 주의하세요, 심지어 이 컴퓨터에 접속하는 것만으로presentationController메모리 누설이 발생할 수 있습니다.

  1. 이전 iOS 버전(< iOS13)과 동일한 동작을 하고 싶은 경우, 모델 프레젠테이션을 풀스크린으로 설정하기만 하면 됩니다.UIModalPresentationStyle.fullScreen

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

    스토리보드를 사용하고 있다면 segua를 선택하고Full Screen을 형성하다Presentation드롭 다운

    여기에 이미지 설명 입력

  2. 인터랙티브 해고를 무효로 하고, 새로운 프레젠테이션 스타일을 설정해 두는 경우UIViewController소유물isModalInPresentation로.true.

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

속성isModalInPresentation도움이 될 거야

매뉴얼에서 다음 항목을 참조하십시오.

로 설정하면true, UIKit 는 뷰 컨트롤러의 범위를 벗어나는 이벤트를 무시하고 뷰 컨트롤러가 화면상에 있는 동안 대화식으로 해제되는 것을 방지합니다.

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

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

비즈니스 로직이 있는 경우 모든 필드에 값을 입력한 후 해제해야 합니다.

온에 ViewDidLoadView Controller:

func viewDidLoad() { 
    self.navigationController?.presentationController?.delegate = self
}

그렇지 않은 경우 단순히

func viewDidLoad() { 
    self.presentationController?.delegate = self
}

그런 다음 위임 방법을 구현합니다.

extension ViewController: UIAdaptivePresentationControllerDelegate {

    func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
        guard let text = firstName.text, text.isEmpty else { return false }
        guard let text = lastName.text, text.isEmpty else { return false }
        ...
    
        return true
    }

}

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

탐색 컨트롤러에 대한 프레젠테이션 옵션을 보여주는 속성 검사기

Apple은 이 링크에서 샘플 코드를 공유했습니다.

it it를 한다.isModalInPresentation많은 사용자가 제안할 수 있습니다.

모든 솔루션이 좋지만 내 경우 움직임을 멈출 수 있는 옵션이 필요합니다.이게 그 코드입니다.

이동을 차단하려면:

self.yourViewController?.presentedView?.gestureRecognizers?[0].isEnabled = false

이동 차단을 해제하려면:

self.yourViewController?.presentedView?.gestureRecognizers?[0].isEnabled = true

언급URL : https://stackoverflow.com/questions/56459329/disable-the-interactive-dismissal-of-presented-view-controller

반응형