티스토리 뷰

iOS

iOS 13 ) UIModalPresentationStyle (1)

Zedd0202 2019. 10. 18. 18:56
반응형


안녕하세요 :) Zedd입니다.

오늘은...슬랙을 보다가 흥미로운 쓰레드를 발견해서..

바로 iOS 13에서 바뀐 modal presentation style 디자인....에 관한 질문과 답변들!!

보면서 생각도 안했던 부분들도 있고 그래서 저도 얼른 공부를 해야겠다고 생각했어요! :)



얼른 봐보겠습니당


iOS 13에 와서 ViewController를 present했는데..

이런식으로 뜨게 바뀐거는 이제 다 아실거에요~~ 

원래같으면 presenting view controller에 속한 view가 view계층에서 사라졌지만..

지금은 저렇게 뒤에 있는것을 볼 수 있씁니다. 


WWDC에서 말한거에 의하면, 


이러한 layering 디자인은 사용자에게 지금 내가 앱에서 어디에 있는지에 대한 컨텍스트를 제공하며, 

둥근 상단 모양은 interactively dismissed 될 수 있음을 나타내는 역할을 한다고 합니다.


뜨는 방식(?)ㅇ이라고 해야하나..아무튼 우리가 iPhone에서 쉽게 볼 수 있었던..? 

(물론 이미 적용된 애플 앱들도 있었지만)

그런 디자인은 아니잖아요?

UIViewController의 modalPresentationStyle 프로퍼티에 새로운 case가 추가된 걸까요? 


 

네니오..

저 디자인에 맞는 새로운 case가 추가된건 아니구요! 

(밑에서 나오겠지만 automatic이라는 새로운 case가 추가되긴함)

위 presentation은 pageSheet 및 formSheet의 "새로운 디자인"일 뿐이에요! 


그럼 궁금해집니다.


Q : 나는 pageSheet으로 딱히 지정한적이 없는데 왜 저렇게 뜨지?

새로운 디자인이 되든말든;;;;; 내가 pageSheet, formSheet으로 지정 안했는데..


그럼 차근차근 왜 그런지 알아봅시다. 

일단 원래의 pageSheet 및 formSheet의 성격이 뭐였는지 봅시다.


지금 discussion이 업데이트가 됐네용


Xcode 10.2에서 quick help띄우면




이렇게 예전의..? discussion을 볼 수 있는 것 같은데..

아무튼 pagesheet, formSheet 둘 다


자 뭐 아시는 분들은 다 아시겠지만, horiaontally compact environment에서는 fullscreen과 동일합니다. 

동일 했었습니다??라고 말해야하나

자 암튼 그러며는 horiaontally compact environment에서는..그러니까 


지금같은 상황에서 pageSheet, formSheet은 fullscreen과 같이 동작했었습니다.


자 이것만 알아두고  

아까 잠깐 언급한 automatic이라는 친구를 더 자세히 알아봅시다. 



UIModalPresentationStyle에 automatic case가 추가 되었습니다. 

automatic? 뭔가 자동으로 해주는 애 같죠? 

맞습니다. 


그리고 이 automatic이 


modalPresentationStyle의 기본값이 되었습니다. 

원래 ViewController의 modalPresentationStyle의 기본값은 fullScreen이었는데 말이죠..


아무튼 automatic으로 바뀜;;

ㅇㅋ 그럼 찍어볼까? 



자..rawValue를 찍어보겠습니다. 



rawValue가 1인게 뭘ㄲ ㅏㅏㅏ

pageSheet?


이상하다


automatic은 -2니까..-2가 출력되어야 하는거 아냐!?




네 아닙니다...!!

automatic은 


야ㅇㅇ내가 자동으로 맞는 modalPresentationStyle로 변환해줄겤ㅋ;;; 그래 내가 해준다 내가 


하는 친구입니다.


그래서 우리가 일반적으로 modal로 띄우는 ViewController들의 modalPresentationStyle은



pageSheet으로 지정되게 됩니다. 흠 지정된다고 말하는게 맞는건지는 잘 모르겠는데...

암튼 무슨느낌인지 이해가 가시나요?

WWDC에서 나온 예제를 하나 더 들어보겠습니다. 



사진 앨범을 present하면 오른쪽과 같은 그림이 ㄴㅏ오게 됩니다.

코드에서 보시다시피 따로 modalPresentationStyle은 바꿔주지 않았죠.



하지만 카메라가 위의 "새로운" pageSheet 디자인 처럼 present되면......안이쁨ㅎ; 

그~~걸 또~~~ 우리 iOS가 알아서 fullScreen으로 띄워줍니다.


네 이게바로 "automatic"입니다. ㅋㅎ 


+ )


만약


카메라가 저렇게 pageSheet style로 present된다면..



fullScreen으로 명시적으로 해주는거 잊지말기


안그러면 진짜 큰일납ㅂ니다





안이쁨






정리하자면

iOS13부터 pageSheet, formSheet이 horiaontally compact environment에서 


1. fullScreen처럼 동작하지 않고

2. 새로운 디자인으로 뜨게 된다.

이렇게요. 


네; 암튼 automatic이 뭔지 좀 아시겠죠? 그리고 왜 pageSheet의 rawValue가 출력된건지도 아시겠죠?



알아야 할 건


1. 원래는 modalPresentationStyle의 기본값이 fullScreen이었어

2. 근데 iOS13부터 기본값이 automatic이 됨

3. automatic은 presenting view controller를 보고 modalPresentationStyle을 선택(?)함

4. 대부분의 경우 pageSheet임.



자 이렇게 대부분의 경우 pageSheet으로 뜨는 것으로 바뀌면서, 우리가 일반적으로(?)생각하던

ViewController의 라이프사이클이 달라진다고 말해야하나 이걸 뭐라 말해야해


regular environment && pageSheet일때는 

원래 그랬으니까 뭐 달라졌다고 말하기가 좀;;


아무튼 같이 보도록 합시다.

iOS 12이전에는 horizontally compact environment에서 pageSheet은 fullScreen으로 동작했었잖아요?

즉,  presenting viewcontroller의 view가 view계층에서 사라지므로...



B를 띄우면 (B의 라이프사이클 메소드는 출력 안했음) 

A의 ~disappear가 불리게 되었죠. 


ㅎㅏ지만!! 지금 기본이!!!!! 기본이 automatic,.그러니까 대부분의 경우 pageSheet으로 뜨게 되면서

그리고, 이 pageSheet이  horizontally compact environment에서도 fullScreen으로 동작안하게 되면서



B를 modal로 띄워도

A viewController(=presenting view controller)의 view가 view계층에서 사라지지 않게 되었습니당. 


사실 놀라울건 없죠. 

horizontally compact environment가 아닐때

&& 

pageSheet일때는 


원래!!! 그랬으니까 

그러니까




순서대로 iOS12..에서 fullScreen, pageSheet, formSheet (portrait 환경). 

iPad Pro 12.9인치는 portrait, landscape환경 모두 regular가 pageSheet이 저렇게 뜨는거임 ㅇㅇ







순서대로 iOS12..에서 fullScreen, pageSheet, formSheet (landscape 환경)


물론 pageSheet, formSheet에서 interactively dismiss는 안됨ㅎ; 이거 뭐라해야할지 몰라서 그냥 애플이 말했던거 적었는데 그 손가락으로 쓸어 내려서 닫는거 ㅇ


아무튼 아이패드에서의 pageSheet, (+ formSheet)은 잘보면 presentingViewController가 사라지지 않는 것을 볼 수 있습니다. 

그러니까 역시나 Viewcontroller의 라이프 사이클도 아까처럼 


이런식이었겠죠.




+ iOS13부터는 







순서대로 pageSheet(이게 이제 기본이니까), fullScreen, formSheet(portrait 환경) 






순서대로 pageSheet(이게 이제 기본이니까), fullScreen, formSheet(landscape환경) 



자 근데 음..네..뭐 하지만 우리가 이제 조금 다르게 생각해야한다는 사실은 맞잖아요?

원래는 당연히!! 다른 modalPresentationStyle을 명시적으로 지정해주지 않는 이상

prsenting view controller의 view는 view계층에서 사라졌고, disappear메소드가 불리는건 당연했잖아요?


근데 이제는 그게 일반적인 상황이 아니게 된거니까..알고는 있어야 할 것 같아요 :D



자... 한가지 더 알아야 하는 사실이 있는데요, 지금 이 상태에서 B를 dismiss해보겠습니다.


네..!! A의 appear함수가 불리지 않았죠.

네 사실 원래 원래..horizontally regular environment에서 pageSheet은 원래..!! 원래 그랬겠죠.

하지만 이게 기본이 되었다니까..아무튼 기억하고 있어야 합니다.



HIG에서도 modal을 "temporary mode"라고 언급하잖아요? 

제 역할을 더 잘할 수 있게 잘 변경되었다고 생각해요!



애초에

내가 A에서 "임시로" B를 모달로 띄웠는데 B를 dismiss했어. 

근데 A의 appear메소드에서 뭔가를 해야한다?

이건 뭔가가...아름답지 않은....



아 원래 새로 소개된...Delegate메소드도 공부하려고 그랬는데..

이 글을 정말 몇번째 퇴고하는지 모르겠네요........zzzz 

힘들다

맘에 안드는데...그나마 좀 정리가 된 것 같아서 발행합니다.





반응형