UIView
애플 공식문서에 따르면, UIView 는 다음과 같은 역할을 한다.
- 내부 bounds rectangle 에 content 를 그리고, content 와의 상호작용을 관리한다.
- 복잡한 content 를 그리기 위해 UIView 를 subclassing 할 수도 있다.
- Drawing and Animation
- Core Graphic 또는 UIKit 프레임워크를 사용해 내부 직사각형 영역에 콘텐츠를 그린다.
- 특정 view properties (frame, bounds, radius, rotate Angle) 등을 animate 를 사용해 새로운 값으로 변경할 수 있다. (Animation 의 정의 -> 일정한 시간 동안 값을 새로운 값으로 변경시키는 것)
- Layout and subview management
- View 는 내부에 여러 개의 subView 들을 가질 수 있다.
- subView 의 위치와 크기를 조정할 수 있다.
- Event handling
- UIView 는 UIResponder 의 subclass 이기 때문에, 터치 이벤트등 다양한 UI 이벤트에 반응할 수 있다.
- Gesture recognizer 를 설치해 공통적인 제스처들에 대응할 수 있다.
SuperView and SubView
하나의 View 는 여러 개의 subView 들을 가질 수 있다. 예를 들어 버튼을 생각해보자.
위 버튼에는 text, image 등 총 두 개의 UI요소가 들어간 것을 볼 수 있다. 즉 하나의 button 이 두 개 이상의 UIView 객체를 가지고 있는 것이다. 이 때 여러 개의 subView 를 가지고 있는 View 를 superView 라 칭한다.
하나의 UIView 는 여러 개의 subView 를 가질 수 있지만 (1대 다 관계), 각 UIView 는 오로지 하나의 superView만 가질 수 있다.
SuperView 안에 포함된 여러 가지 subView 들은 superView 안에서 자신의 위치와 크기를 결정해야 한다. frame 과 bounds 프로퍼티를 사용해 크기와 위치등을 결정할 수 있다. frame 과 bounds 도 아주 중요한 프로퍼티이므로 자세히 공부하도록 하자.
아까 UIView 는 자신의 사각형 영역 안에 content 들을 그린다고 했다. 다음과 같이 (100, 100) 에 위치하고 (200, 400) 의 사이즈를 가진 파란색 UIView 가 있다고 생각해보자.
let uiview: UIView = UIView(frame: CGRect(x: 100, y: 100, width: 200, height: 400))
uiview.backgroundColor = .blue
view.addSubview(uiview)
이제 이 UIView 에 (300, 500) 의 크기를 가지고 빨간색 배경을 가지는 새로운 UIView 를 추가해보자.
let redView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: 300, height: 500))
redView.backgroundColor = .red
uiview.addSubview(redView)
uiview이 관리하는 사각형의 크기는 넓이 200, 높이 400 이지만, 이보다 더 큰 넓이 300, 높이 500의 새로운 빨간색 뷰가 추가되었을 때 uiview 가 관리하는 사각형의 크기를 넘어서 redView 를 그리는 것을 볼 수 있다.
기본적으로 subView 의 영역이 superView 의 영역을 넘어서는 경우, subView 가 잘리지 않고 그대로 전부 그려지는 것을 볼 수 있다.
만약 superView 사각형 밖으로 어떤 content 도 그려지길 원하지 않는다면, clipsToBounds 프로퍼티를 true 로 지정하자.
uiview.clipsToBounds = true
Draw View
UIView 는 내부 직사각형 영역에 있는 Content 를 Core Grapich, UIKit 프레임워크를 사용해 화면에 그린다. 이 때 시스템이 UIView 의 draw(_:) 메소드를 호출한다. 기본적으로 draw 메소드는 이미 정의되어있으며, UIView 를 subclassing 해 새로운 컴포넌트를 생성하더라도 직접적으로 재정의할 일은 거의 없다.
View 의 속성이 바뀌어서 (예를 들어 배경색이 바뀐다던가, 위치가 바뀐다던가.. ) 시스템이 UI 를 다시 그려야 할 경우, setNeedsDisplay 혹은 setNeedsLayout() 메소드를 호출해야 한다.
UIKit 은 기본적으로 View 의 속성이 바뀔 때마다 UI 를 다시 그리는게 아니라, drawing cycle 이 있고, 이 cycle 을 돌 때마다 UI 를 업데이트 한다. setNeedsDisplay() 함수는 다음 drawing cycle 에 UI 를 다시 그려야 한다는 것을 시스템에게 알려주는 함수다.
보통 우리가 Button, UIView, UILabel 등의 text 혹은 배경색 속성을 변경할 때, 단순히 프로퍼티를 변경하는 것으로 UI 가 다시 그려져서 우리의 의도대로 동작하는 것을 볼 수 있는데, 프로퍼티 변경 시 내부적으로 저 함수들을 자동으로 호출해서 그런 것이다.
Aniamtion
UIView 의 특정 속성들을 변경할 때 animation 을 사용해 변경할 수 있다.
- frame
- 뷰가 속한 superView 좌표계에서의 위치와 크기
- bounds
- 뷰 자체 좌표계
- center
- 뷰의 중심
- transform
- 회전과 크기 등
- alpha
- 뷰의 투명도
- backgroundColor
- 뷰의 배경색
Animation 을 사용해 프로퍼티를 변경하면, 지정한 시간동안 프로퍼티의 현재 값 에서 변경하려는 값까지의 변화가 일어난다. 예를 들어 현재 View 의 center 좌표가 (100,100) 이고, 2초간의 aniamtion 을 사용해 center 좌표를 (200, 200) 으로 변경하면 2초 동안 서서히 center 좌표값이 변경된다.
실제로 애니메이션을 적용해보자.
// 2초 동안
UIView.animate(withDuration: 2, delay: 0, options: [.repeat, .autoreverse]) {
// 배경색을 빨강색으로 변경
uiview.backgroundColor = .red
// center 좌표를 + 100
uiview.center = CGPoint(x: uiview.center.x + 100, y: uiview.center.y + 100)
// .pi 만큼 회전
uiview.transform = .init(rotationAngle: .pi)
}
지정한 2초의 시간동안 각 프로퍼티가 서서히 변경되는 것을 볼 수 있다.
references
[iOS 앱개발] UIView 알아보기
안녕하세요 Ick입니다. 오늘은 UIView에 대해서 알아보려고 합니다. UIView는 어떤 구조를 가지고 있는지 한 번 알아보겠습니다! 참고한 공식문서들은 아래와 같습니다. UIView View and Window Architecture
icksw.tistory.com
Apple Developer Documentation
developer.apple.com
'ios 면접 질문' 카테고리의 다른 글
Scene Delegate의 역할에 대해 설명하시오 (0) | 2022.07.22 |
---|---|
swift initialization (0) | 2022.07.19 |
Copy on write (0) | 2022.07.12 |
Struct 와 Class, Enum 의 차이점 (0) | 2022.07.03 |
실제 디바이스가 없을 경우 개발 환경에서 할 수 있는 것과 없는 것을 설명하시오. (0) | 2022.07.03 |
Comment