티스토리 뷰
draw(_:)
draw 메서드는 뷰에서 CGRect 직사각형으로 특정된 영역에 대해 뷰르 다시 그리는 등 업데이트 할 때, 호출되는 메서드입니다.
Declaration
선언 방식
draw(_:) 메서드는 UIView의 인스턴스 메서드로, UIView 객체 인스턴스로부터 접근해서 사용하는 메서드입니다.
인자(parameter)로는 CGRect(CoreGraphics Rect) 를 받아서 해당 Rect를 다시 그려주는, 업데이트 하는 역할로 사용됩니다.
바로 이어서 draw(_:) 메서드에서 인자로 받는 CGRect타입의 rect에 대해서 알아보겠습니다.
Parameters
rect(_ rect:) 인자
- rect
draw(_:) 메서드는 CGRect 타입의 rect 인자를 받습니다. 해당 rect는 업데이트 되어야 하는 영역을 갖고 있습니다.
해당 rect의 범위는 업데이트 되는 뷰의 bounds 비율이 됩니다.
예를들어, 뷰가 그려지는 첫 시점에는 직사각형은 그 자체가 전형적으로 현재 뷰로부터 보이는 전체 영역이 됩니다.
그러나, 부분적인 그리기 연산이 수행 될 때의 직사각형(rect)는 해당 뷰의 특정부분이 될 수도 있다는 점도 알아두는게 좋겠습니다.
draw(CGRect) 메서드 역할
해당 메서드의 기본 구현은 아무것도 없습니다.
Core Graphics, UIKit 등에서 뷰의 컨텐츠를 그리는 기술을 사용하는 서브 클래스들은 해당 메서드를 오버라이드해야하며, 해당 구현부에 그리기 코드를 작성해야만 합니다.
보통 해당 메서드, draw(CGRect)는 뷰가 처음 표현되어질때, 뷰의 보이는 부분이 무효화되는 이벤트가 발생했을때 등에 호출 되어집니다.
만약 구현하는 뷰가 뷰 자신의 컨텐츠를 그 외의 방법으로 그려낸다면, 해당 메서드(draw(CGRect))를 오버라이드할 필요는 없습니다. 예를 들자면, 만약 뷰의 단순 배경색상을 설정하거나, 해당 뷰가 기본 레이어 객체(underlying layer object)를 사용해서 컨텐츠를 직접 설정하는 경우 등이 있습니다.
해당 메서드(draw(CGRect))가 호출이 될 때, UIKit은 해당 뷰를 위해 그리기 환경(drawing environment)를 적절하게 설정하게 되며, 개발자는 해당 뷰의 컨텐츠가 랜더링, 업데이트 되어야 할때마다 단순하게 해당 메서드(draw(CGRect))를 호출해주면 뷰를 그릴 수 있습니다.
특별하게, UIKit은 그리기를 위해 그래픽 내용을 생성 및 설정하며, 해당 그리기 내용이 적용되는 뷰 영역에 딱 맞도록 변형해줍니다.
개발자들은 UIGraphicsGetCurrentContext() 메서드를 통해 그래픽 내용의 참조값을 얻을 수 있습니다.
다만, 해당 그래픽 내용에 대한 강한 참조를 만들지 말아야 합니다. 그 이유는 draw(_:) 메서드 호출 과정에서 해당 그래픽 내용을 바꿀 수 있기 때문입니다.
개발자는 올바른 그리기를 위해 rect 인자값으로 특정되는 직사각형을 그리기위한 제약을 적절히 설정해야합니다.
예를 들면 만약 그리는 뷰의 isOpaque 프로퍼티가 true로 설정되어 있다면, 당신의 draw(_:) 메서드는 전제적으로 opaque 컨텐츠까지 포함한 직사각형까지 감안해서 설정해야합니다.
draw(CGRect) 메서드 사용 간 주의사항
만약 현재 뷰가 UIView를 직접 상속받고 있다면, 해당 draw 메서드 내에서 super를 호출할 필요는 없습니다.
하지만 만약 View가 다른 View를 상속하게 된다면, draw 메서드 구현부의 적절한 위치에 super 메서드를 호출해 주어야 합니다.
특히 주의해야 할 사항은, 개발자는 해당 메서드, draw(CGRect)를 직접 호출해서는 안됩니다.
만약 뷰의 일부를 무효화해야 한다면, 혹은 뷰의 일부분이 다시 그려져야 한다면, setNeedsDisplay()나 setNeedsDisplay(_:)등으로 다시 그려져야함을 시스템에 알려준 후, 다음 그리기 사이클에 draw(CGRect) 메서드가 시스템에 의해 호출될 수 있도록 할 수 있습니다.
'iOS 개발 > 개발자문서 정보' 카테고리의 다른 글
iOS UIView 업데이트, layoutIfNeeded 메서드 개요 (0) | 2020.08.19 |
---|---|
iOS UITableView, reloadRows 사용법/주의사항 (0) | 2020.08.18 |
iOS UIView, setNeedsDisplay 메서드 알아보기 (0) | 2020.08.17 |
iOS UIViewController, addChild 메서드 알아보기 (0) | 2020.08.17 |
iOS UIKit 스택뷰, UIStackView 특징 및 사용방법 (0) | 2020.08.13 |
- Total
- Today
- Yesterday
- swift reduce
- 프로그래머스
- 프로토콜
- Collection
- Protocol
- 프로그래머스swift
- CoreML
- swift알고리즘
- 백준알고리즘
- Swift 알고리즘
- 부스트코스
- swift문제
- swift
- 알고리즘
- 백준swift
- 김프매매
- 스위프트
- SwiftUI
- 알고리즘문제
- swift string
- ios
- 컬렉션
- 자연어처리
- swift언어
- swift 문자열
- 개발자문서
- publisher
- createML
- swift 기초
- uikit
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |