오늘 학습 정리할 내용은 UIGraphics를 prefix로 갖는 다양한 내용들이다.
학습정리를 할 계기는 생각보다 단순했다. 다양한 이미지들을 저장해놓고 쓰는 것이 아닌 상황에 맞게 그릴 수 있는 기술이 매우 흥미로웠다.
적절한 예인지는 모르겠지만 다양한 필터가 있는 카메라 앱도 결국에는 소스 코드로 해당 이미지를 그리는 것이라고 생각한다.
UIGraphics Prefix
UIKit와 관련된 그래픽 작업을 수행하는 함수들에 사용되는 접두사이다.
한번 어떤 종류들이 있는지 살펴보자.
일단 가장 먼저 주목해야하는건 Drawing 탭에 속해 있는 것을 볼 수 있다.
무언가 앞에서 설명한 것처럼 그래픽 작업 즉, 그리는 작업을 한다는 것 같다.
두번 째로는 Render , Context, Format 형태로 짝이 지어져있는 것을 볼 수 있다.
하나씩 살펴보자.
1. Renderer
open class UIGraphicsImageRenderer : UIGraphicsRenderer {
...
}
open class UIGraphicsPDFRenderer : UIGraphicsRenderer {
...
}
Render는 캔버스와 도화지가 있는 아티 스튜디오를 관리하는 매니저라고 생각하면된다.
- 매니저(UIGraphicsRenderer)가 알아서 도화지를 준비해 주고
- 우리는 편하게 그림을 그린다.
- 이후 매니저가 자동으로 정리해주고, 그림을 파일로 변환하여 저장해 준다.
여기서 도화지에 그림을 그릴 수 있는 종류는 Image와 PDF가 되는 것 같다.
조금 다르지만 두 Renderer 보통 그림을 그릴 도화지의 크기를 생성자에 넣어주는 것 같다.
2. Context
open class UIGraphicsImageRendererContext : UIGraphicsRendererContext {
...
}
open class UIGraphicsPDFRendererContext : UIGraphicsRendererContext {
...
}
두번째는 Context다. 애플 공식 설명을 보면 graphics rednderer들을 위한 그릴 수 있는 환경이라고 써져있다.
UIGraphicsRenderer가 아트 스튜디오의 매니저라면, UIGraphicsRendererContext는 그림을 그릴 수 있는 책상과 그 위에 놓인 도화지, 붓, 연필, 물감 같은 도구이다.
image와 pdf 종류에 따라 제공되는 도구가 다르니 자세한건 사용할 때 찾아보면 될 것 같다.
3. Format
open class UIGraphicsImageRendererFormat : UIGraphicsRendererFormat {
/*
그래픽 컨텍스트의 디스플레이 스케일을 나타냄
붓의 세밀함을 결정하는 것과 비슷함.
스케일이 높으면 더 작은 세부사항까지 정밀하게 그릴 수 있는 고해상도 이미지를 만들 수 있다.
스케일이 2.0이면 1픽셀이 실제 2픽셀로 렌더링되어 더 높은 해상도를 갖게 된다.
*/
open var scale: CGFloat
/*
그래픽 컨텍스트가 완전히 불투명한지 여부를 나타냄
캔버스가 투명한지, 불투명한지를 결정하는 것
불투명한 캔버스는 모든 배경이 꽉 찬 색으로 채워지고,투명한 캔버스는 일부 배경이 비칠 수 있으며 이미지를
PNG처럼 배경이 투명하게도 가능하다.
opaque가 true이면 배경이 불투명하게 그려지고, false이면 투명한 픽셀을 허용한다.
*/
open var opaque: Bool
/*
표준 동적 범위(SDR)와 고동적 범위(HDR) 중 어느 것을 사용할지를 결정한다.
HDR은 더 넓은 범위의 밝기와 색상 표현을 지원한다.
빛의 밝기와 색의 깊이를 얼마나 표현할 수 있는지를 결정하는 것
HDR 지원은 더 넓은 범위의 색과 밝기를 표현하는 기능으로 HDR을 사용하면 그림에더 생생한 색상과 깊은 명암 대비를
적용할 수 있다.
고해상도 디스플레이와 HDR 지원 기기에서는 이 설정이 이미지의 품질에 큰 영향을 줄 수 있다.
*/
@available(iOS 12.0, *)
open var preferredRange: UIGraphicsImageRendererFormat.Range
}
open class UIGraphicsPDFRendererFormat : UIGraphicsRendererFormat {
// PDF 문서에 대한 메타데이터
open var documentInfo: [String : Any]
}
위에서 UIGraphicsRendererContext는 그림을 그리는 도구 테이블라고 정리했다.
애플 공식문서를 보면
UIGraphicsRendererFormat은 UIGraphicsRendererContext의 대표적인 설정 속성을 정리해 놓은 집하이라고 한다.
간단히 얘기해 놓으면 UIGraphicsRendererFormat은 화가가 그림을 그리기 전에 준비하는 도구 세트라고 생각할 수 있다.
미리 설정된 UIGraphicsRendererContext를 사용하기위한 도구 세트이다.
어느정도 모든 개념이 이해가 된 것 같다.
마지막으로 간단한 예시 코드를 보며 우리가 배운 개념대로 주석을 달고 끝내보자.
예시 코드
func resizeImageWithFormat(image: UIImage, targetSize: CGSize) -> UIImage {
let format = UIGraphicsImageRendererFormat() // 도구 세트를 생성
format.scale = UIScreen.main.scale // 화면 크기에 맞게 붓의 섬세함 지정
format.opaque = false // 배경을 투명하게 허용
let renderer = UIGraphicsImageRenderer(size: targetSize, format: format)
// 매니저를 생성할 때 도화지 크기와 만들어둔 도구 세트를 제공
// 이미지를 새로운 크기로 리사이즈하고 그리기
let resizedImage = renderer.image { (context: UIGraphicsRendererContext) in
// 이미지를 리사이즈
image.draw(in: CGRect(origin: .zero, size: targetSize))
// 단순히 리사이즈만 했기 때문에 별도의 도구를 사용하지 않아 context가 사용되지 않음
}
return resizedImage
}
참고
'iOS > UIKit' 카테고리의 다른 글
NSCoding , NSSecureCoding (0) | 2024.09.10 |
---|---|
NSObject (1) | 2024.09.10 |
UIGestureRecognizer (0) | 2024.09.05 |
frame vs bounds (4) [ 사용 용도 ] (1) | 2024.09.02 |
frame vs bounds (3) [origin, viewport ] (3) | 2024.09.02 |