← Назад к вопросам

В каких единицах измеряется CGPoint?

1.6 Junior🔥 142 комментариев
#UIKit и верстка

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Единицы измерения CGPoint в iOS/macOS разработке

CGPoint является фундаментальной структурой в фреймворках Core Graphics, UIKit и AppKit, но важно понимать, что сама по себе структура CGPoint не имеет «единиц измерения» в традиционном физическом смысле. Её компоненты x и y представляют собой безразмерные числовые значения типа CGFloat. Однако реальный физический смысл этим значениям придаёт контекст, в котором они используются.

Контексты и системы координат

Единицы измерения CGPoint становятся определёнными только при привязке к конкретной системе координат:

  1. Точки (Points)
    *   Это **основная и наиболее часто используемая логическая единица** в iOS/macOS разработке.
    *   В UIKit (iOS) **1 point** может соответствовать 1 физическому пикселю (на не-Retina экранах) или 2, 3 (на Retina, Super Retina) физическим пикселям. Это обеспечивает **независимость от разрешения (resolution independence)**.
    *   Координаты `frame`, `center`, `bounds` в `UIView` измеряются в точках.
```swift
let pointInPoints = CGPoint(x: 100.0, y: 200.0)
button.frame.origin = pointInPoints // 100x200 points
```

2. Пиксели (Pixels)

    *   При работе непосредственно с **Core Graphics контекстами** (например, при рисовании в `draw(_ rect: CGRect)` или при создании `UIGraphicsImageRenderer`), значения могут интерпретироваться как **физические пиксели устройства**.
    *   Для конвертации между точками и пикселями используется масштаб экрана (`scale`).
```swift
let scale = UIScreen.main.scale // 2.0, 3.0 и т.д.
let pointInPoints = CGPoint(x: 100, y: 100)
// Конвертация в пиксели (например, для работы с bitmap)
let pixelX = pointInPoints.x * scale
let pixelY = pointInPoints.y * scale
```

3. Единицы пользовательского пространства (User Space Units)

    *   В Core Graphics (Quartz) при рисовании фигур (`CGPath`) или использовании `CGAffineTransform` координаты `CGPoint` изначально задаются в **абстрактном пользовательском пространстве**. Затем они трансформируются в пространство устройства (пиксели) через **текущую матрицу преобразования (CTM - Current Transformation Matrix)**.

  1. Физические единицы (миллиметры, дюймы)
    *   Для задач печати или точного физического измерения можно использовать **функции Core Graphics**, конвертирующие единицы, опираясь на `DPI` (dots per inch) устройства вывода.
```swift
// Пример условной конвертации (в реальности используется CGContext)
let dpi: CGFloat = 72.0 // Например, 72 точки на дюйм
let inches: CGFloat = 1.0
let points = inches * dpi // 72 points
let pointInInches = CGPoint(x: points, y: points)
```

Сводная таблица контекстов

Контекст / FrameworkТипичная единицаПримечание
UIKit / AppKit (работа с view)Points (логические точки)Независимость от разрешения, основа интерфейса.
Core Graphics (рисование в draw(_:))Pixels (пиксели) или User Space UnitsЗависит от контекста и применённых трансформаций.
Core AnimationPointsРаботает с логическими координатами, как и UIKit.
Изображения (UIImage, CGImage)Pixels при создании, Points при отрисовкеsize в пикселях, но отрисовывается с учётом scale.

Практический пример и важный нюанс

// Создаём две идентичные точки
let p1 = CGPoint(x: 50.0, y: 50.0) // Безразмерные числа
let p2 = CGPoint(x: 50.0, y: 50.0)

// Их физический смысл проявится только при использовании:
let view = UIView()
view.center = p1 // Здесь (50.0, 50.0) - это 50x50 POINTS относительно системы координат superview

UIGraphicsBeginImageContextWithOptions(CGSize(width: 100, height: 100), false, 2.0)
let context = UIGraphicsGetCurrentContext()
context?.move(to: p2) // В этом контексте (50.0, 50.0) может интерпретироваться как 100x100 PIXELS (50 * scale 2.0)

Ключевой вывод: Значения CGPoint.x и CGPoint.y — это абстрактные числа типа CGFloat. Их реальная «единица измерения» — это всегда единица текущего контекста (координатной системы), в котором эта точка применяется. Для разработчика интерфейсов iOS основной и мысленной единицей следует считать point (логическую точку), так как система автоматически управляет преобразованием points в пиксели в зависимости от плотности дисплея.