안녕하세요 UIView에 대해서 궁금증이 생겨 튜터님에게 물어보고
여러가지 답변을 받은 후 개인적으로 좀 더 공부를 하고 작성해두면 좋을것 같아
작성하게 되었습니다
UIView
UIView는 iOS application 사용자 인터페이스를 구성하는 기본적인 구성 요소 중 하나입니다
Type : Class
뷰는 콘텐츠를 랜더링하고 모든 상호 작용에 대해서 처리하고 있습니다
그리고 고정된 배경색을 표시하기 위해 인스턴스화 하고 사용할 수 있는 구현화 할 수 있는 클래스입니다
그리고 그 외에도 정교한 오브젝트들도 그릴 수 있습니다
Label, Image, Button ... 기타 인터페이스 요소를 표시하기에 적합합니다
원론적으로 내가 코드로만 구현했을 때 반드시
requred init?(corder: NSCoder)메서드로 진입 유무에 대해서 추가적으로 튜터님이 질문을 던져줬을 때
더더욱 궁금증이 생겨 공부하게 되었습니다
UIView 초기화
지정된 프레임 사각형 뷰를 만들고 있습니다
사각형을 포인트로 측정하여 center / bounds 속성을 적절히 사용하여 구현할 수 있습니다
프로그래밍 방식으로 생성하는 경우 이 메서드를 사용하고 있습니다
이 메서드를 재정의 하여 초기화를 수행할 수 있지만 구현 시작시 UIVeiw 호출을 해야합니다
- 새로운 뷰 객체는 윈도우 뷰 계층 구조에 삽입되어야 합니다
- iOS에서 모든 화면 요소는 뷰 계층 구조(view 하이어라키)에 속해 있어야만 화면에 표시될 수 있습니다
- UIView 객체를 사용하기 전에 반드시 사용할 window의 뷰 계층에 추가해야합니다
- 코드적으로 뷰 객체를 생성할 때 이 UIView 클래스를 생성 지정자를 사용하여 새로운 객체를 만들 수 있습니다
let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
- 서브클래스에서 초기화 메서드를 오버라이드 할 때 부모 클래스의 초기화 과정을 이해하고 적절하게 호출하는게 중요하다고 생각합니다
- UIView 클래스를 상속하여 새로운 서브클래스를 만들 때 init(frame: CGRect)메서드를 오버라이드 하여 사용자 정의 초기화 작업을 할 수 있습니다 하지만 이 과정에서 반드시 super.init(frame: frame)을 호출하여 부모클래스인 UIView의 초기화를 실행해야합니다
import UIKit
class CustomView: UIView {
// 지정 생성자를 오버라이드
override init(frame: CGRect) {
// 먼저 부모 클래스의 초기화 메서드를 호출
super.init(frame: frame)
// 여기서 추가적인 사용자 정의 초기화 작업을 수행
self.backgroundColor = UIColor.blue // 배경색을 파란색으로 설정
self.layer.cornerRadius = 10 // 둥근 모서리를 10으로 설정
self.isUserInteractionEnabled = true // 사용자 상호작용을 가능하게 설정
}
// UIView를 상속할 때 필수적으로 구현해야 하는 초기화 메서드
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
// 사용 예시:
let customView = CustomView(frame: CGRect(x: 0, y: 0, width: 200, height: 100))
// 이제 customView는 UIView의 기본 설정과 CustomView에서 정의한 사용자 정의 설정이 모두 적용된 상태
- required init?(corder aDecoder: NSCoder) 호출되지 않도록 하려면?
- 스토리보드 삭제
- 프로젝트에서 사용중인 스토리보드 파일을 삭제하게되면 Interface Builder에 의해 자동으로 생성되는 객체가 없어지게됩니다
- 뷰를 코드로 생성 :
- 모든 뷰 객체를 코드로 직접 생성하거나 XIB 파일을 사용해서 뷰를 정의하고 코드로 로드하는 방법입니다
- 코드에서 인스턴스화
- 스토리보드 없이 모든 뷰를 코드에서 인스턴스화하면 스토리보드에 의존하지 않고 뷰를 관리할 수 있게됩니다
- 좀 전에 사용한 customView 처럼 말이죠
- 스토리보드 없이 모든 뷰를 코드에서 인스턴스화하면 스토리보드에 의존하지 않고 뷰를 관리할 수 있게됩니다
- 스토리보드 삭제
UIView 계층 구조
부모 뷰와 자식 뷰로 구성된 계층 구조를 가지고 있습니다
addSubview(_:) 메서드를 통해서 자식 뷰를 추가할 수 있습니다
supwerview는 부모뷰에 접근할 수 있으며
subviews는 배열을 통해서 자식 뷰에 접근이 가능합니다
그리고 removeFromSuperview() 메서드를 통해서 부모 뷰에서 뷰를 제거할 수 있습니다
뷰의 배치와 레이아웃
frame : 위치와 크기를 정의
bounds : 내부 콘텐츠 영역을 정의합니다
center : 중앙점을 정의합니다
오토레이아웃을 통해서 동적으로 설정이 가능합니다
layoutSubviews() 메서드를 재정의하여 서브뷰의 레이아웃을 커스터마이즈할 수 있습니다
setNeedsLayout() / layoutIfNeed() 메서드를 사용해서 레이아웃을 바로 업데이트 가능합니다
뷰 그리는 작업
UIView는 CALayer 객체를 사용해서 그리기 작업을 수행합니다
draw(_:) 메서드를 재정의해서 커스텀으로 그릴 수 있습니다
setNeedsDisplay() / setNeedsDisplayInRect(_:) 를 사용해서 뷰의 일부나 전체를 다시 그리도록 즉시 요청할 수 있습니다
터치 이벤트 처리
UIView 터치 이벤트를 처리할 수 있습니다
UIResponder를 통해서
touchesBegan - touchesMoved - touchesEnded - touchesCancelled
제스처를 통해서도(UITapGestureRecognizer - UIPanGestureRecognizer)처리할 수 있습니다
애니메이션
animate로 통해서 여러가지 속성들을 변경할 수 있습니다
좌표변환
convert메서드를 사용해서 뷰 간의 좌표를 변환할 수 있습니다
뷰 상태 변경
hidden 속성을 사용해서 뷰를 숨기거나 표시할 수 있습니다
alpha값을 사용해서 투명도를 부여할 수 있습니다
backgroundColor 속성을 사용해서 배경색을 설정할 수 있습니다
UIView 클래스를 살펴보자면
다양한 프로토콜을 지니고 있습니다
하나하나 정리하자면 양이 너무 방대하기 때문에 아래에 추가적으로 게시글을 작성하도록 하겠습니다
시각적 요소를 표현하고 다양한 기능과 인터페이스를 구현하기위해서 여러가지 프로토콜을 채택하는데 여기서
채택된 프로토콜을 짧게 설명하자면
UIResponder
터치 이벤트와 같은 사용자 인터페이스 응답하는 메커니즘을 제공합니다
NSCoding
뷰 객체를 인코딩 / 디코딩하여 아카이브와 복원할 수 있습니다
UIAppearance
앱 전체에서 일관된 스타일링을 적용할 수 있도록 합니다
UIAppearanceContainer
UIAppearance 속성을 관리합니다
UIDynamicItem
UIKit Dynamics의 물리 효과를 적용할 때 사용합니다
bounds / center / transform
UITraintEnvironment
뷰의 크기가 클래스와 같은 환경 변화에 반응할 수 있도록 합니다
traitCollectionDidChange(_:)
UICoordinateSpace
뷰의 좌표를 정의하고 변환할 수 있습니다
UIFocusItem
포커스 가능한 인터페이스 요소를 정의하고 있습니다
UIFocusItemContainer
UIFocusItem을 관리할 수 있습니다
CALayerDelegate
뷰의 베이킹 레이어와 관련된 델리게이트 메서드를 제공하고 있습니다
display(_:) / draw(_:in:)
이러한 다양한 프로토콜을 제공하여서 유연하게 관리할 수 있는 사용자 인터페이스 기반을 제공하고 있습니다
그래서 역동적인 UI를 효율적으로 구축할 수 있습니다
UIView와 관련된 개념과 동작을 공부하면서 다양한 측면에서 알게되었습니다
UIView는 각종 UI 요소와 상호작용을 하고 있습니다
UIView에서는 초기화메서드가 있고 여러 계증 구조가 있고 레이아웃이 존재하고
그리기와 애니메이션도 UIView에 있으며 이벤트 처리도 함께 처리가 가능하다는걸 알게되었습니다
그리고 UIView에서 다양한 프로토콜을 채택하여 유연하면서 확장가능하고 다양한
상황에서 사용이 가능한지에 대해서 알게되었습니다
'UIKit' 카테고리의 다른 글
UIKit | ViewController 생명 주기 (0) | 2024.07.12 |
---|---|
UIKit | UITableView에 관하여 (0) | 2024.07.03 |
UIKit | 스토리보드 없이 코드로만 구현하고 싶다면? -1 (2) | 2024.07.01 |
UIKit | 모서리 둥글게 만들기 (0) | 2024.06.11 |
iOS 화면 이해 - 프레임 / 오토레이아웃 (0) | 2024.06.04 |