새로운 iOS 13 모달 프레젠테이션 : 프리젠 테이션 컨트롤러가 아래로 이동하지 않음


11

iOS 13에서 UIViewController를 모달로 표시 할 때 이상한 동작이 있습니다. iOS 13에서 모두 본 새로운 프레젠테이션 스타일은 다음과 같습니다.

제시된 뷰 컨트롤러는 제시된 뷰 컨트롤러 뒤에 나타납니다. 또한 "스택"을 모방하도록 아래로 이동합니다.

제시된 뷰 컨트롤러는 제시된 뷰 컨트롤러 뒤에 나타납니다.  또한 "스택"을 모방하도록 아래로 이동합니다.

한편, 내 앱을 통해 뷰 컨트롤러를 제시 할 때이 효과가 계속 나타납니다.

새로운 뷰 컨트롤러를 제시 할 때 제시된 뷰 컨트롤러가 전혀 움직이지 않습니다

새로운 뷰 컨트롤러를 제시 할 때 제시된 뷰 컨트롤러가 전혀 움직이지 않습니다

이 코드를 사용하여이 뷰 컨트롤러를 표시합니다.

let controller = storyboard?.instantiateViewController(withIdentifier: "tutorial") as! TutorialController
controller.modalPresentationStyle = .pageSheet
controller.modalTransitionStyle = .coverVertical
present(controller, animated: true, completion: nil)

내 질문은 다음과 같습니다. 왜 이런 일이 발생하는지 그리고 일반적인 iOS 13 스타일로 프리젠 테이션 컨트롤러를 표시하는 방법이 있는지 궁금합니다.

미리 감사드립니다!


테스트로, controller.modalTransitionStyle = .coverVertical심지어 주석을 달아보십시오 controller.modalPresentationStyle = .pageSheet(이 코드가 iPad에서도 실행되는 경우 프리젠 테이션 스타일이 필요하지만).
rmaddy

나는 그것을 언급했지만 아무것도 변경하지 않습니다 :(
CentrumGuy

답변:


3

문제가 내보기 컨트롤러 계층 구조였습니다. 프리젠 테이션보기 컨트롤러를 내 앱의 루트보기 컨트롤러로 만들어서 고칠 수있었습니다. 먼저 백그라운드 컨트롤러를 루트 뷰 컨트롤러로 설정하여

window.rootViewController = self

그런 다음 이전 코드를 사용하십시오.

let controller = storyboard?.instantiateViewController(withIdentifier: "tutorial") as! TutorialController
controller.modalPresentationStyle = .pageSheet
controller.modalTransitionStyle = .coverVertical
present(controller, animated: true, completion: nil)

뷰 컨트롤러를 제시했습니다. 도와 주신 모든 분들께 감사드립니다!


같은 문제가 있습니다. rootViewController 플래그를 어디에 설정 했습니까? segue 직전에?
Paweł Zgoda-Ferchmin

"백그라운드 컨트롤러"를 제시했을 때 설정했습니다. 그것들을 컨트롤러 1, 2, 3이라고 불러서 일을 더 쉽게 만들어 봅시다 (1은 뒤쪽에서 가장 먼 곳, 2는 3 뒤의 배경에, 3은 Tutorial Controller의 앞쪽에있는 것입니다). 현재 제어기 1을보고 있습니다. 제어기 1에서 present ()를 호출하여 제어기 2를 제시하는 대신 제어기 2를 루트보기 제어기로 설정했습니다. 이것은 기본적으로 컨트롤러 1을 제거하고 창에는 이제 계층 구조에 컨트롤러 2 만 있습니다. 이제 컨트롤러 2에서 present ()를 호출하여 컨트롤러 3을 정상적으로 표시 할 수 있습니다.
CentrumGuy

물론, 그것은 저에게 효과적이지만 segue 동안 dissapearing status bar 또는 animation cutting과 같은 다양한 문제를 유발합니다. 또한 그것이 안전하다고 생각하지 않습니다. 이에 대한 더 나은 솔루션이 있어야한다 ...
파블 Zgoda-Ferchmin

이러한 문제는 언제 발생합니까? present ()를 호출하거나 루트 뷰 컨트롤러를 설정할 때? 상태 표시 줄이 검은 색 텍스트로 나타나고 present ()가 발생하면 검은 색 배경에 나타나서 응용 프로그램의 배경과 혼합되어 사라지는 상태 표시 줄이 될 수 있습니다.
CentrumGuy

1
간단한 데모 프로젝트를 만들었습니다. 여기에서 볼 수 있습니다 : github . 모든 논리는 Controller1.swift에 있습니다. 도움이되는지 알려주세요!
CentrumGuy

1

vc.modalPresentationStyle = .fullScreenUINavigationController가 없으면를 사용하여 문제를 해결할 수 있다고 생각합니다 . 그렇지 않으면 다음과 같이 이러한 코드를 사용할 수 있습니다.

let navigationController = UINavigationController(rootViewController: vc) 
navigationController.modalPresentationStyle = .fullScreen 
present(vc, animated: true)

iOS 13에서는 Apple이 View Controllers의 기본 프리젠 테이션 스타일을 iOS 12의 전체 화면에서 모달 시트로 변경 한 새로운 기능이기 때문에


2
.fullScreen은 컨트롤러를 전혀 볼 수없는 이전 iOS 12 프레젠테이션처럼 보입니다. 그것은 내가 가고있는 것이 아닙니다.
CentrumGuy

@CentrumGuy, " medium.com/better-programming/… " 링크를 볼 수 있습니다 . 자세한 내용은 설명되어 있습니다.
Apple은 기본적으로

1
Apple이 iOS 13에서 기본 프리젠 테이션 스타일을 변경 한 것을 알고 있습니다. 그러나 앱에서 뷰 컨트롤러를 표시 할 때 제시 컨트롤러가 iOS 13의 다른 곳 에서처럼 움직이지 않습니다. 첫 번째와 두 번째의 차이점을 볼 수 있습니다 제시하는 뷰 컨트롤러가 맨 위에있는 뷰 컨트롤러 뒤에 표시되는 방식의 그림.
CentrumGuy

도와 드리겠습니다.
glotcha

1

프로그래밍 방식으로 :

let vc = UIViewController()
vc.modalPresentationStyle = .fullScreen //or .overFullScreen for transparency
self.present(vc, animated: true, completion: nil)

스토리 보드에서 :

여기에 이미지 설명을 입력하십시오

그게 다야. 루트 컨트롤러 나 창을 전혀 사용할 필요가 없습니다.

참고 로이 기사를 방문 하십시오 .


0

인스펙터 툴바에서 변경할 수 있습니다. 달성하려면 : Tollbar Inspector Tollbar의 다섯 번째 섹션으로 이동 한 다음 Presentation 필드를 Full Screen으로 변경하십시오.


-1

이것은 설정해야 할 유일한 속성이어야합니다

presentedViewController.modalPresentationStyle = .automatic

https://developer.apple.com/videos/play/wwdc2019/224/에 자세히 설명되어 있습니다.


자동으로 설정
해도이

포 그라운드 뷰 컨트롤러 뒤의 뷰 컨트롤러는 내가 "현재"라고 부르는 컨트롤러입니다. (컨트롤러 뒤에 볼 수있는 것)
CentrumGuy

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