pt — points、iOSおよびmacOSにおける論理的な計測単位で、物理的な画面解像度からインターフェースを抽象化します。1 pointは非Retina画面(@1x)では1ピクセル、Retina(@2x、@3x)では2〜3ピクセルに相当します。この記事ではptの動作原理、さまざまな画面でのスケーリング、CGPointとUIFont.pointSizeの使用について説明します。
重要なポイント
pt(point)— iOSにおける論理的な計測単位で、開発者が物理的なディスプレイ解像度に依存しない抽象的な座標でインターフェースを記述できるようにします。Appleは2010年にiPhone 4とRetinaディスプレイの発表とともにpointsの概念を導入しました。Retina以前は、開発者は直接ピクセルを使用していました — 1 UIピクセルが1物理ピクセルに相当していました。
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を介して自動的に行われます。
スケールファクターは、1論理ポイントに何ピクセル対応するかを決定します。Appleは3つのレベルを使用しています:@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)の2つのフィールドを持ち、値はポイントで指定されます。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ポイントはスケールファクターに応じて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では1ポイントが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アプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。