pt — points, iOS 및 macOS의 논리적 측정 단위로, 물리적 화면 해상도에서 인터페이스를 추상화합니다. 하나의 point는 비Retina 화면(@1x)에서 1픽셀, Retina(@2x, @3x)에서 2~3픽셀에 해당합니다. 이 문서는 pt의 작동 원리, 다양한 화면에서의 스케일링, CGPoint 및 UIFont.pointSize 사용을 설명합니다.
핵심 내용
pt(point) — 개발자가 물리적 디스플레이 해상도와 무관한 추상 좌표로 인터페이스를 설명할 수 있게 해주는 iOS의 논리적 측정 단위입니다. Apple은 2010년 iPhone 4와 Retina 디스플레이 출시와 함께 points 개념을 도입했습니다. Retina 이전에는 개발자가 직접 픽셀을 사용했습니다 — UI 픽셀 하나가 물리적 픽셀 하나와 동일했습니다.
iOS 좌표계는 포인트를 기반으로 구축되었습니다: 포인트(0,0)는 화면의 왼쪽 상단 모서리에 있으며, X축은 오른쪽, Y축은 아래쪽으로 향합니다. 각 디바이스 클래스별 포인트 단위 화면 크기는 일정합니다: iPhone SE — 375×667 pt, iPhone 15 Pro — 393×852 pt, iPad — 768×1024 pt(세로), 1024×768 pt(가로). 물리적 해상도는 1179×2556 px(iPhone 15 Pro)일 수 있지만 — 개발자는 포인트로 작업합니다.
Apple Human Interface Guidelines에 따르면, 포인트는 UIKit의 기본 추상화입니다. 모든 프레임워크 — UIKit, SwiftUI, Core Graphics, SpriteKit — 는 포인트로 작동합니다. 픽셀로의 변환은 렌더링 단계에서 UIScreen.nativeScale을 통해 자동으로 이루어집니다.
스케일 팩터는 하나의 논리적 포인트에 해당하는 물리적 픽셀 수를 결정합니다. Apple은 세 가지 레벨을 사용합니다: @1x — 1 pt = 1 px(Retina 없는 iPad mini, 구형 모델), @2x — 1 pt = 2 px(2020년 이전 대부분의 iPhone, iPad Retina), @3x — 1 pt = 3 px(iPhone X 이상, iPhone 15 Pro 포함).
| 디바이스 | pt 단위 크기 | px 단위 크기 | 스케일 |
|---|---|---|---|
| iPhone SE(3세대) | 375 × 667 | 750 × 1334 | @2x |
| iPhone 14 | 390 × 844 | 1170 × 2532 | @3x |
| iPhone 15 Pro Max | 430 × 932 | 1290 × 2796 | @3x |
| iPad Pro 12.9" | 1024 × 1366 | 2048 × 2732 | @2x |
| iPad mini(6세대) | 744 × 1133 | 1488 × 2266 | @2x |
스케일 팩터는 UIScreen.main.scale(UIKit용) 및 @Environment(\.displayScale)(SwiftUI용)을 통해 확인할 수 있습니다. 에셋 로드 시 사용됩니다: 시스템은 Assets.xcassets에서 @2x 또는 @3x 접미사가 있는 이미지를 자동으로 선택합니다. 개발자는 Retina 디바이스에서 @1x 이미지를 로드해서는 안 됩니다 — 성능과 품질이 저하됩니다.
CGPoint 구조체는 iOS 및 macOS에서 좌표를 표현하기 위한 기본 타입입니다. x(CGFloat)와 y(CGFloat)의 두 필드를 포함하며, 값은 포인트 단위로 지정됩니다. CGPoint는 모든 Apple 프레임워크에서 사용됩니다: UIKit(frame.origin), Core Graphics(CGContext), SpriteKit(SKNode.position), Core Animation(CALayer.position).
// CGPoint — 포인트 단위 좌표 작업
import UIKit
// 포인트 생성
let point = CGPoint(x: 100.0, y: 200.0)
print("좌표: \(point.x), \(point.y)")
// 수학 연산
let offset = CGPoint(x: 16.0, y: 8.0)
let translated = CGPoint(
x: point.x + offset.x,
y: point.y + offset.y
)
// 포인트 간 거리
func distance(from a: CGPoint, to b: CGPoint) -> CGFloat {
let dx = b.x - a.x
let dy = b.y - a.y
return sqrt(dx * dx + dy * dy)
}
// 포인트를 픽셀로 변환
extension CGPoint {
func toPixels(scale: CGFloat) -> CGPoint {
CGPoint(x: x * scale, y: y * scale)
}
}예제의 toPixels 메서드는 UIScreen.main.scale을 통해 포인트를 물리적 픽셀로 변환하는 방법을 보여줍니다. UIKit에서는 이 변환이 렌더링 시 자동으로 이루어지지만, Core Graphics 및 Metal 작업 시 개발자는 명시적인 픽셀 변환이 필요할 수 있습니다. 모든 애니메이션 계산, 충돌 감지 및 레이아웃은 포인트로 수행됩니다.
UIFont.pointSize 속성은 폰트 크기를 포인트 단위로 반환합니다 — 이는 iOS에서 표준 타이포그래피 단위로, 인쇄에서 계승되었습니다(1 pt = 1/72인치). Apple은 Mac OS 초기 버전부터 폰트에 pt를 사용해 왔습니다. iOS에서 폰트 크기는 UIFont.systemFont(ofSize:) 또는 SwiftUI Font.system(size:)를 통해 포인트 단위로 지정됩니다.
// Swift에서 UIFont.pointSize 작업
import UIKit
// pt 단위 크기로 폰트 생성
let titleFont = UIFont.systemFont(ofSize: 28.0, weight: .bold)
let bodyFont = UIFont.systemFont(ofSize: 17.0)
let captionFont = UIFont.systemFont(ofSize: 12.0)
// pointSize 읽기
print("제목 크기: \(titleFont.pointSize) pt")
// Dynamic Type — 자동 스케일링
let scaledFont = UIFontMetrics.default.scaledFont(for: bodyFont)
print("스케일링됨: \(scaledFont.pointSize) pt")
// 폰트 크기 비교
func font(from size: CGFloat, weight: UIFont.Weight) -> UIFont {
UIFont.systemFont(ofSize: size, weight: weight)
}UIFontMetrics는 iOS 11에 추가된 동적 폰트 스케일링 메커니즘입니다. 사용자의 접근성 설정(Settings > Display & Brightness > Text Size)에 따라 pointSize를 자동으로 조정합니다. UIFontMetrics를 사용하지 않으면 폰트가 스케일링되지 않아 WCAG 접근성 요구 사항을 위반합니다.
pt와 px의 차이는 iOS 개발을 이해하는 데 중요합니다. pt는 논리적 단위이고, px는 물리적 단위입니다. 하나의 포인트는 스케일 팩터에 따라 1, 2 또는 3픽셀에 해당할 수 있습니다. 개발자는 포인트로 작업하고, 시스템은 래스터화 단계에서 이를 픽셀로 변환합니다.
| 특성 | pt | px |
|---|---|---|
| 단위 유형 | 논리적(디바이스 독립) | 물리적(하드웨어 픽셀) |
| 해상도 의존성 | 아니오 | 예 |
| 사용처 | UIKit, SwiftUI, Core Graphics, 레이아웃 | 이미지, Metal, raw buffer |
| 변환 | 1 pt = scale × px(스케일 1~3) | 1 px = pt / scale |
| 예시(iPhone 15 Pro) | 393 × 852 pt | 1179 × 2556 px |
핵심 결론: 동일한 클래스의 모든 디바이스에서 포인트 단위 인터페이스 크기는 동일합니다. 375 pt 너비 화면 — iPhone SE와 iPhone 14(기본 모델) 모두에 적용됩니다. 차이는 그 375 pt에 몇 개의 물리적 픽셀이 들어가는지뿐입니다. 이는 각 디바이스에 대한 수동 적응 없이 통일된 UI를 보장합니다.
SwiftUI에서 개발자는 명시적으로 포인트를 사용하지 않습니다 — 모든 크기는 Dp(디바이스 독립 포인트, pt와 동등)를 통해 지정됩니다. SwiftUI는 렌더링 시 자동으로 스케일 팩터를 적용하지만 환경 값 displayScale을 통해 액세스를 제공합니다.
// SwiftUI — 포인트 및 스케일 팩터 작업
import SwiftUI
struct ContentView: View {
@Environment(\.displayScale) private var displayScale
var body: some View {
VStack(spacing: 16) {
Text("제목")
.font(.system(size: 28, weight: .bold))
Text("본문 예제 텍스트")
.font(.body)
HStack {
Text("스케일 팩터:")
.font(.caption)
Text("\(displayScale, specifier: "%.1f")")
.font(.caption.weight(.bold))
}
}
.padding(20)
.frame(width: 300)
}
}SwiftUI는 프레임워크 수준에서 pt를 추상화합니다. .font(.body)는 자동으로 Dynamic Type을 사용합니다 — 폰트 크기가 사용자 설정에 맞게 조정됩니다. SwiftUI는 픽셀 단위의 폰트 크기 지정을 허용하지 않습니다 — Font 및 타이포그래피 시스템을 통해서만 가능합니다. 이는 개발자의 추가 노력 없이 인터페이스 접근성을 보장합니다.
자주 묻는 질문
pt — 화면 해상도와 무관한 iOS의 논리적 포인트입니다. px — 디스플레이의 물리적 픽셀입니다. iPhone 15 Pro에서 하나의 포인트는 3픽셀(@3x), iPad Pro에서는 2(@2x)에 해당합니다. 개발자는 항상 포인트로 작업합니다.
UIKit: UIScreen.main.scale. SwiftUI: @Environment(\.displayScale). 일반적인 값: 1.0(@1x), 2.0(@2x), 3.0(@3x). iPhone 15 Pro Max에서는 값이 3.0입니다.
Apple은 본문(UIFontTextStyle.body)에 17 pt를 권장합니다. 제목의 경우 28~34 pt, 캡션의 경우 12~13 pt입니다. Dynamic Type 스타일은 사용자의 접근성 설정에 따라 자동으로 스케일링됩니다.
Dynamic Type — iOS 7에 도입된 iOS 자동 폰트 스케일링 시스템입니다. 텍스트가 시스템 폰트 크기 설정(Text Size) 및 접근성 매개변수(Bold Text, Larger Text)에 적응할 수 있게 합니다. UIFontMetrics 또는 SwiftUI Font 스타일을 통해 구현됩니다.
아니요. 최신 Apple 디바이스는 @2x 또는 @3x의 Retina 디스플레이를 사용합니다. @1x 이미지는 Retina가 없는 iPad(iPad 2, iPad mini 1세대)와의 호환성을 위해서만 필요합니다. iOS 13부터 모든 디바이스는 최소 @2x를 지원합니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.