iOS

iOS ) Managing the View Hierarchy

Zedd0202 2019. 10. 31. 11:18
반응형



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

오늘은 UIView의 메소드들을 공부해보겠습니다. 그 중에서도 특히



Managing the View Hierarchy에 관한 메소드들을 중점적으로 공부해볼게요.


그럼 이런 메소드들을 공부하기에 앞서, 알아야 할 프로퍼티가 있는데요. 

바로..정말 많이 보셨을


subviews라는 프로퍼티입니다.

ㅇㅇ 그냥 subview들..그러니까 view계층과 연관된 subview들을 배열에 담아서 리턴해주는거임

배열에서 subview들 순서는 화면에 표시되는 순서를 반영합니다. 

인덱스 0의 view는 가장 뒤에 있는 view(back-most view)에요.


UIKit 및 기타 시스템 프레임워크에서 선언된 복잡한 View의 경우, View의 모든 subview는 일반적으로 private으로 간주된다고 해요 ㅇ0ㅇ...(언제든지 변경될 수 있지만)

따라서 이러한 타입의 시스템 제공 view에 대한 subview를 검색(retrieve)하거나 수정해서는 안된다고 합니다.

그렇게 하면 차후 시스템 업데이트 중에 코드가 깨질 수 있다고 해요. 당욘하겠죠?


너네 navigationBar 진짜 접근 개어렵게 해놨더라......


Q : 왜 back-most view가 subviews의 첫번째야???

A : 간단합니다 .



걍 저 순서대로 착착 쌓인다고 생각하면 됨. 그래서 가장 뒤에 있는게 지금 보다시피 brownView죠. 

암튼 이거 알구 가야함;;

그럼 bringSubviewToFront, sendSubviewToBack 이친구들 공부해봅시ㅏ다. 



bringSubviewToFront

지정된 subView를  siblings의 맨 위에 표시되도록 이동합니다. siblings이라는게 형제..뭐 그런 뜻이잖아요?  siblings은 같은 Hierarchy의 view들이라고 생각하면 편함 아까 위 그림에서 색깔 있던 view 3개가 siblings.

(아니라면 알려주세요..?)


bringSubviewToFront는


이렇게 파라미터로 view라는 걸 가지는데, 이 view는 내가 앞으로 가져올 view를 의미합니다.

이 메소드는 지정된 view를 subviews 프로퍼티의 view array 맨 끝으로 이동합니다.


그럼 보세요


지금 brownView가 subviews의 가장 처음에 있잖아요?

근데 bringSubviewToFront를 하면 내가 지정한 view를 subviews array의 가장 “끝”으로 보내준대

그말은 뭐다..?



ㅇㅇ 이렇게 해주겠다


이 siblings의 superView는 myView인데요.



이 MyView라는 View안에서 지금 subview들간에 순서 이동을 하고싶은거잖아요?

그럼 코드는



이렇게 되면 될 것 같아요.

원래 myView의 subview가 [brownView, blueView, orangeView]였잖아요?

그러니까 myView에 대해서 bringSubviewToFront를 호출하는 거에요!...


빌드하면





왼쪽이 오른쪽이 됩니다. 아나 크기..안맞는거 넘 거슬리지만 암튼...

ㅇㅋ??


그럼 이제 넘 자연스럽게.. sendSubviewToBack에 대해서 알게 되는...



sendSubviewToBack


sendSubviewToBack 역시 view하나를 받는데, 이번엔 그 view를 siblings “뒤에 보이도록” 이동해주는 메소드입니다.

즉, 가장 뒤에 있는거 무ㅏ래따..? ㅇㅇ subviews 배열의 첫번째로 이동시켜주는거임



아니 화질이 왜이렇지..? 맥북 15년형은 좋은점이 도대체 뭔가요....

암튼 이 orangeView를 뒤로 보내고 싶어요! 그럼 어케한다..? 




orangeView가 맨 뒤로 간 것을 알 수 있습니당.


그럼 여기서 질문!

orangeView를 뒤로 보내긴 보내는데, 



맨 뒤로 말고 blueView뒤, brownView앞으로 보내고 싶음...

이라고 하면,



요 insertSubview메소드들을 쓰면 되는 것 같아요.

제...기억에 단 한번도 써본 적 없는 메소드 같은데...!!!!

한번 공부해보겠습니다 ㅎㅎ




insertSubview(_:at:)


근데 우리 subviews 배열의 그런 순서? 그런걸 공부하고 난 후니까 뭔가 훨씬 더...잘 이해가 가지않나요?

subview의 원래 순서가 있었는데..내가 어떤 view를 어떤 index에 넣겠다!!(그래서 subviews의 순서를 바꾸겠다)

인 메소드입니다.

insertSubview는 지정된 index에 subview를 insert합니다...라는 간단한 정의를 가지고 있어요.

ㅇㅇ

view는 여기서 nil일 수 없구요. index는 0에서 시작하며 subview의 count보다 클 수 없어요. 


아니 이거 discussion이 왜이래...이거 뭔상관이야...

뭐지......>??

저는 잘 이해가 안가는데..


This method establishes a strong reference to view and sets its next responder to the receiver, which is its new superview.

Views can have only one superview. If view already has a superview and that view is not the receiver, this method removes the previous superview before making the receiver its new superview.

“이 메소드는 view에 대한 strong reference를 설정하고, 다음 responder를 receiver(superview)에 설정합니다

view는 하나의 superView만 가질 수 있습니다. view에 이미 superView가 있고, 해당 view가 receiver가 아닌경우, 이 메소드는 receiver를 새로운 superView로 만들기 전에 이전 superView를 제거합니다. “


....

흠 아니 뭔상관이지

아?


아~~~~~~~~~ㅏ아ㅏㅏ아아

음..제가 이해한게 맞는지 모르겠지만 대충 맞는거 같으니 말해봅니다.



자 저런 노란색 view가 있다고 생각해봅시당.

얘를 MyView..그러니까 [brownView, blueView, orangeView]를 subviews로 가지고 있는 myView에 넣고싶음 ㅇㅇ


근데 

"view는 하나의 superView만 가질 수 있습니다”

지금 yellowViewsuperView는 저 green view인데 이미 superView가 있는 상태죠?

근데 이상태에서 



myView에 대해 insertSubview를 호출해볼게요. 

index도 넣어줬는데, myView의 subviews의 count만큼 넣어줬다는 뜻은...? ㅇㅇ

맨 뒤에 넣겠다는거고, 그 말은 즉 yellow view는 가장 위에 위치하겠군요.

봅시다.




네 오른쪽 처럼 되는데요. 일단 yellowView가 제일 위에 위치한거 보이시죱

암튼..제가 추측하는건, yellowView초록색 superView를 가지고 있었는데 view는 하나의 superView밖에 가질 수 없으니..


"view는 하나의 superView만 가질 수 있습니다. view에 이미 superView가 있고, 해당 view가 receiver가 아닌경우, 이 메소드는 receiver를 새로운 superView로 만들기 전에 이전 superView를 제거합니다. “


discussion에서 위와같은 말을 한게 아닐까 하는 추측을....

이전 superView를 제거한다는거는..그 superView를 진짜 제거한다는 뜻이 아니라..그 내가 insert하고싶은 view의 superView를...제거하고..그러니까 이걸 뭐라해야하지? 참조를 없앤다? 연결고리를 없앤다? 더이상 내가 넣고싶은 view의 superView가 더이상 superView가 되지 않게 한다..? 이런느낌으로 이해하시면 될듯




아님말고


암튼  



제일 위에꺼 봤고, 밑에 두 insertSubview 메소드만 보면 되겠군요. 

파라미터 이름을 보면 어떤메소든지 감이 오는데...어떤 subview “위에” 또는 “밑에” 위치하게 하는 그런 애같음(?)


봅시다.


insertSubview(_:aboveSubview:)

view 계층에서 다른 view 위에 view를 insert한다..

view와 siblingSubview가 있는데, 

view는 내가 insert하고 싶은 view인데..만약 siblingSubview의 sibling이 아닌경우, superView에서 제거된다고 해요. 

그리고 siblingSubview는 내가 어떤View “위에” 위치하게 할거다!에서 어떤 View를 맡고있음..


그럼 해봅시더



이렇게 하면


저렇게 yellowViewblueView위에” 위치하게 되죠. 

결과물을 보면 알 수 있듯이..myView의 subviews의 blueView 인덱스 바로 “뒤에” insert 하기때문에, orangeView의 “뒤에” 위치하게 되죠.


insertSubview(_:belowSubview:)

belowSubview도 똑같습니다. 위에가 밑에로 바뀐것 뿐..



이렇게 하면


yellowViewblueView “뒤에” 가게 됩니다. 


마지막으로 메소드 하나만 더 보도록 합시다.


exchangeSubview(at:withSubviewAt:)

이것도 단 한번도...사용한적이 없는...메소드인데 이름만 보면 exchange하는..그러니까 바꾸는(?) 그런 메소드같아요

정의는, 지정된 index에서 subview를 exchange(교환)한다..고 합니다.

아하..index1이랑 index2랑 바꾸게따

뭐 이런거겠군요.

swap같은ㄴ 느낌으로 이해하면 되겠죠?..


자 이상태에서.. 가장 앞에 있는 orangeView와 가장 뒤에 있는 brownView를 바꿔보겠습니다.



....

아니 솔직히 index얻는거



너무.......아니..뭐 이게 최선이겠지만...

암튼..이렇게 하면

자리가 바뀝니다.


오..이렇게 좀 공부하고 나니까

왜 

"Managing the View Hierarchy”

인지 확 알겠네요 :)


이 내용은 꼭 한번 제대로 익히고 싶었는데..너무 늦게 공부한 감이 없지않아 있습니다 ㅎㅎ...


도움이 되었길 바래요 XD


반응형