[iOS BoostCourse] iOS의 View 체계
오늘은 iOS View 체계에 대해 공부를 해보았습니다. 오늘은 iOS View 체계의 관련된 애플의 문서 중에서 Boostcourse에서 제공하는 가이드 중 다음 두 가지를 먼저 공부해보고 정리해보았습니다.
- ❤️ : 이해하기 쉬운 초보자에게 꼭 필요한 개념
- 💚 : 이해하기 어렵지만 초보자에게 꼭 필요한 개념
그럼 바로 시작해보도록 하겠습니다.
❤️ View Hierarchies and Subview Management
하나의 뷰는 그들의 컨텐츠를 보여주기 위해서는 뷰는 다른 뷰들의 컨테이너 역할을 하게 된다. 하나의 뷰가 다른 뷰의 컨테이너가 된다면 부모-자식 관계가 형성됩니다. 자식 뷰는 subview로 부모 뷰는 superview로 불립니다.
이러한 관계로 부모 뷰의 사이즈의 변화는 자식 뷰들의 사이즈와 위치의 변화로 이어집니다. 여러분이 부모 뷰의 사이즈나 위치를 변경시키면 자식 뷰들 각각에 대해 적절한 resizing 행위를 조절할 수 있습니다.
뷰의 계층에서 뷰가 어떤 순서로 나열되어 있는지는 이벤트들에 대해 여러분들의 어플리케이션이 어떻게 동작하는지를 결정합니다. 터치 행위가 특정 뷰에서 일어나게 되면 시스템은 이러한 터치 이벤트가 발생한 정보를 객체에 담아 이벤트가 일어난 뷰에 전달합니다. 하지만 해당 뷰에서 이렇게 전달된 이벤트를 처리하지 못한다면 자신의 부모 뷰에 처리되지 못한 이벤트 객체를 넘깁니다. 이러한 넘김 행위는 Responder chain에 걸쳐서 진행되게 됩니다. Responder chain에는 view controller도 포함되어 있기 때문에 view controller에게도 전달되기도 합니다. 만일 어떤 객체도 이 이벤트를 처리하지 못한다면 최종적으로 Application 객체에 도달하고 이 이벤트는 무시되게 됩니다.
Responder Chain은 굉장히 중요합니다. 이에 대해서는 추후에 따로 공부를 하고 정리해볼 계획입니다. Responder Chain
💚 The Relationship of the Frame, Bounds, and Center Properties
이 부분은 제가 예전에도 공부한 것을 정리한 적이 있습니다. 먼저 해당 링크를 먼저 확인해주시기 바랍니다.
뷰 객체는 그들의 사이즈와 위치를 그들의 frame, bounds 그리고 center 프로퍼티를 사용하여 추적합니다.
- frame 프로퍼티는 사이즈와 superview의 좌표 시스템 위에서의 뷰의 위치를 명시하는 frame rectangle을 포함합니다.
- bounds 프로퍼티는 사이즈와 자신만의 로컬 좌표 시스템을 포함하는 bounds rectangle을 포함합니다.
- center 프로퍼티는 superview 좌표 시스템 위에서 뷰의 중심 좌표를 포함합니다. center뷰는 superview에 의존하기 때문에 frame rectangle과도 관계를 맺습니다.
여러분은 런타임중에 뷰의 위치를 바꾸거나 사이즈를 변경하는 등의 geomtry를 조작하는 행위를 할 때 center와 frame요소를 주로 사용할 수 있습니다. bounds 프로퍼티는 뷰가 실제로 그려질 때 주로 사용합니다. bounds는 뷰 자체의 좌표시스템을 갖고 있기 때문에 기본적으로 (0,0)의 위치와 frame rectangle과 같은 사이즈를 갖습니다.
frame, bounds 그리고 center 프로퍼티는 다른 것들과 별개로 독립적으로 값을 변경할 수 있지만 이들 각기 요소들 값의 변경은 서로에게 다음고 같은 영향을 미칩니다.
- frame 프로퍼티를 설정할 때 bounds 프로퍼티의 사이즈 값은 frame rectangle의 새로운 사이즈에 맞춰 변경됩니다. center 프로퍼티 역시 변경된 frame rectangle에 맞춰 변경됩니다.
- center 프로퍼티를 설정할 때 frame 프로퍼티의 기존 값도 역시 변경됩니다.
- bounds 프로퍼티를 설정할 때도 frame rectangle 사이즈 값 역시 bounds에 맞추어 변경됩니다.
기본적으로 하나의 뷰의 frame은 superview의 frame에 잘리지 않습니다. 그러므로 superview의 frame 바깥에 위치하게되는 어떤 subview의 일부나 전체는 잘리지 않고 온전히 보여지게 됩니다. superview의 clipsToBounds
에 값을 YES
로 설정한다면 이러한 행위를 바꿀 수 있습니다. subview가 시각적으로 온전하건 잘리건 상관없이 터치 이벤트는 superview의 bounds에 맞추어 전달됩니다. 그말인 즉슨 잘린 부분에 대해서는 터치 이벤트가 해당 뷰에 전달되지 않는다는 의미입니다.
💚 Points Versus Pixels
iOS에서는 모든 좌표 값과 거리 값은 point라는 하나의 단위로 부동 소수점 값을 사용합니다. point의 측정 가능한 값은 디바이스마다 다른 값을 갖습니다. point에 대해 알아야 할 주요 사항은 point는 고정된 프레임을 제공한다는 것입니다.
이러한 포인트 기반 측정 시스템은 표준 좌표 공간을 제공합니다. 이러한 좌표 시스템을 기반으로 여러 요소들을 배치시키게 됩니다. 디바이스마다 하나의 point는 각기 다른 pixel값을 갖습니다. 가끔 1 point가 1 pixel에 대응되기도 하지만 절대 이런 가정을 하고 계산을 하면 안 됩니다.
디바이스 레벨에서 이런 포인트 기반 좌표 시스템은 특정 시점에서 픽셀 단위로 변경이 됩니다. 하지만 이러한 매핑 과정은 전적으로 시스템이 담당하게 됩니다.
그렇기 때문에 만일 1 point가 1x1 pixel인 디바이스와 1point가 1x1pixel이 아닌 다바이스 (서로 다른 키기의 디바이스) 에서의 100 x 100 pixel의 이미지는 같은 픽셀 크기이지만 실제로 디바이스에서는 서로 다른 크기로 보여지기 됩니다.
이를 해결하기 위해 iOS는 서로 다른 픽셀 밀도로 이미지를 지정하고 디바이스 해상도에 맞추어 이미지를 불러오게 됩니다. 이러한 이유로 낮은 픽셀의 이미지는 해상도가 큰 디바이스에서 깨져보이는 것입니다.
💚 Tasks That Involve Windows
어플리케이션이 window와 상호작용하는 순간은 어플리케이션 실행 초기에 window를 생성할 때가 유일합니다. 하지만 여러분은 어플리케이션의 window 객체를 어플리케이션과 관련된 다음의 작업들을 수행하는데 사용할 수 있습니다.
- 좌표나 rectangle을 window의 좌표계로 변환하거나 window 좌표계로부터 변환하여 가져올 때 window 객체를 사용합니다.
- window notification을 window와 관련된 변화를 추적하는데 사용합니다. window는 보여지거나 숨겨지는 등의 상태 변화가 일어날 때 notification을 발생시킵니다. 이러한 notification을 이용하여 어플리케이션 내에서 특정 작업들을 수행할 수 있습니다.
마무리
오늘은 이렇게 간단히 boostcourse에서 제시하는 iOS의 View 체계에서 초보자가 알아야 할 지식들에 대해 공식 문서를 정리해보고 공부해보았습니다. boostcourse에서 제시하고 있는 View 체계에서 알아야 할 지식들은 위에 있는 것들만이 아닙니다. 보다 심화된 주제들도 있으니 이것들을 천천히 공부하고 정리하여 포스팅해보도록 하겠습니다.
또한 저는 boostcourse에서 제시하고 있는 공식 문서의 내용들을 모두 공부할 것이지만 내부 작동원리와 구성에 관한 이론들만 정리할 것입니다. 그렇기 때문에 공식 문서에서 설명하고 있는 코드들에 대한 것은 따로 포스팅하지 않을 예정입니다. 그러므로 반드시 edwith의 boostcourse에서 제시하는 것들을 직접 공부해보시는 것을 추천드립니다. 감사합니다.
참고자료