본문 바로가기
iOS/설명

[iOS] UIModalPresentationStyle

by Sky Titan 2022. 7. 6.
728x90
 

Apple Developer Documentation

 

developer.apple.com

UIModalPresentationStyle

  • ViewController들을 띄울 때 쓰일 수 있는 modal 스타일들
  • Style에 따라서 ViewController들의 lifecycle 콜백들이 호출이 안될 수도 있다.

 

1. automatic

  • 시스템에 의해 선택되는 기본 presentation style
  • 해당 스타일 지정 시, 대부분의 ViewController들은 UIKit이 pageSheet 스타일로 매핑해준다.
    • 하지만 일부 system ViewController들은 다른 스타일로 매핑될 수도 있다.
  viewWillAppear viewWillDisappear
First ViewController x x
Second ViewController O O

 

2. none

  • 어떠한 adaption들도 만들어지지 못하는 style
  • ViewController 띄울 때 쓰는 스타일이 아님
    • 대신, 이미 띄워진 ViewController의 스타일을 적용하길 원치 않을 때, adaptiveDelegate의 adaptivePresentationStyle(for:) 메서드에서 해당 style을 리턴하면 된다.
    • 해당 스타일 적용 후 present하면 크래시 발생

 

3. fullScreen

  • Device에 스크린 전체를 덮게 하는 스타일
  • presenting ViewController에 있는 view들은 presentation이 완료되면 사라진다.
    • 즉, ViewController를 띄우고 나면 presenting ViewController는 context에서 사라지기 때문에, presented ViewController의 투명도를 조절해도 배경에 presenting ViewController가 보이지 않는다.
  viewWillAppear viewWillDisappear
First ViewController O O
Second ViewController O O

 

4. pageSheet

  • 밑의 content의 일부분만 덮는 스타일
    • 밑에 깔려있는 ViewController가 화면에서 사라지지 않음
  • modalPresentationStyle을 지정하지 않았을 때 기본적으로 적용되는 스타일
  • background content가 visible하면 viewWillDisappear, viewDidDisappear가 호출 안된다.
  • 밑으로 drag하는 방식으로 ViewController를 닫을 수 있다.
  viewWillAppear viewWillDisappear
First ViewController (presenting) x x
Second ViewController (presented) O O

 

5. formSheet

  • content를 스크린 중앙에 배치시키는 스타일
  • iPhone에서는 pageSheet와 다를게 없음
    • iPad에서 preferredContentSize 지정 후 사용 시 백그라운드에 dim layer가 깔리고 View가 화면 중앙에 뜬다.
  viewWillAppear viewWillDisappear
First ViewController (presenting) x x
Second ViewController (presented) O O

 

6. currentContext

파란색 ViewController가 가장 마지막에 띄워졌지만 firstViewController의 영역 안에서만 띄워짐

  • 다른 ViewController의 content 영역 안에서 띄워지는 스타일
  • definesPresentationContext 필드가 true로 지정된 ViewController의 영역 안에서만 띄워진다.
    • 일반 ViewController들은 해당 필드가 기본적으로 false이고, Container Controller들은 true로 지정되어있다.
예시설명
1. firstViewController의 frame을 수정해서 크기 조정
2. firstViewController의 definesPresentationContext를 true로 지정
3. firstViewController 위에 SecondViewController(빨간색)을 띄움
4. SecondViewController위에 파란색 ViewController를 띄움
5. firstViewController의 frame 영역안에서만 파란색 ViewController가 띄워진다.
  viewWillAppear viewWillDisappear
First ViewController (presenting) O O
Second ViewController (presented) O O

 

7. custom

  • 커스텀 애니메이터 오브젝트들과 커스텀 presentation controller를 이용하여 custom presentation style을 구현하게 해준다.
  • UIViewControllerTransitioningDelegate를 채택하는 presented viewController를 띄울 수 있다.

 

8. overFullScreen

  • full screen과 거의 동일하나, presented content 밑에 있는 ViewController가 View계층에서 사라지지 않는다.
    • 때문에 presented ViewController의 alpha값 조절 시 presenting ViewController가 보인다.
  • background content의 viewWillDisappear, viewDidDisappear가 호출되지 않는다.
  viewWillAppear viewWillDisappear
First ViewController (presenting) X X
Second ViewController (presented) O O

 

9. overCurrentContext

  • overFullScreen + currentContext의 느낌
  • definesPresentationContext 필드가 true로 지정된 ViewController의 영역 안에서만 띄워지고 presentingViewController가 View계층에서 사라지지 않음
  viewWillAppear viewWillDisappear
First ViewController (presenting) X X
Second ViewController (presented) O O

 

10. popover

  • popover view 영역 안에서 띄워짐
  • iOS13 이후에선 formSheet와 동일한 동작
  • iOS12 까지는
    • horizontally compact 환경에선, fullScreen과 동작
    • horizontally regular, vertically compact 환경에선, formSheet와 동일한 동작
728x90

댓글