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

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

1.0 Junior🔥 201 комментариев
#UIKit и верстка

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

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

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

Единицы измерения CGRect

В iOS и macOS разработке структура CGRect использует точки (points) в качестве базовых единиц измерения. Это фундаментальная концепция, которую необходимо понимать каждому iOS-разработчику.

Точки (Points) vs Пиксели (Pixels)

Ключевое отличие: CGRect оперирует точками, а не пикселями напрямую. Точка — это абстрактная единица, которая может соответствовать одному или нескольким физическим пикселям на устройстве.

// CGRect создается с использованием точек
let rect = CGRect(x: 10, y: 20, width: 100, height: 50)
// Здесь все значения указаны в точках, не в пикселях!

Координатная система CGRect

CGRect содержит два основных компонента:

  • origin (CGPoint) - точка начала прямоугольника
  • size (CGSize) - размеры прямоугольника

Оба этих компонента измеряются в точках:

struct CGRect {
    var origin: CGPoint  // x и y в точках
    var size: CGSize     // width и height в точках
}

struct CGPoint {
    var x: CGFloat      // Координата X в точках
    var y: CGFloat      // Координата Y в точках
}

struct CGSize {
    var width: CGFloat  // Ширина в точках
    var height: CGFloat // Высота в точках
}

Тип CGFloat

Важно отметить, что все значения в CGRect используют тип CGFloat, который может быть либо Float, либо Double в зависимости от архитектуры процессора (32-битной или 64-битной). Это обеспечивает максимальную точность вычислений на всех устройствах.

Масштабирование для Retina дисплеев

Основная причина использования точек вместо пикселей — поддержка дисплеев с разной плотностью пикселей:

  • Non-Retina дисплеи: 1 точка = 1 пиксель
  • Retina дисплеи: 1 точка = 2×2 пикселя (4 пикселя)
  • Retina HD дисплеи (iPhone 6+): 1 точка = 3×3 пикселя (9 пикселей)

Пример преобразования:

let viewRect = CGRect(x: 0, y: 0, width: 100, height: 100)

// На Non-Retina: 100×100 пикселей
// На Retina: 200×200 пикселей
// На Retina HD: 300×300 пикселей

Практические последствия

  1. Независимость от разрешения: Ваш код работает одинаково на всех устройствах
  2. Автомасштабирование: Система автоматически преобразует точки в пиксели
  3. Векторная графика: Использование точек позволяет корректно отображать векторные ресурсы
// Создание UIView с размером в точках
let view = UIView(frame: CGRect(x: 0, y: 0, width: 320, height: 480))
// На iPhone 4 это будет 640×960 пикселей
// На iPhone 8 это будет 750×1334 пикселей (масштабируется)

Контекст рисования

При работе с Core Graphics важно понимать разницу:

// В UIKIt: используется система координат в точках
let rect = CGRect(x: 0, y: 0, width: 100, height: 100)

// В Core Graphics: можно работать с пикселями напрямую
if let context = UIGraphicsGetCurrentContext() {
    // Масштабирование контекста для точного пиксельного контроля
    context.scaleBy(x: scaleFactor, y: scaleFactor)
}

Особые случаи

  • Методы draw(_:): Работают в точках
  • Core Animation: Использует точки, но с субпиксельной точностью
  • UIScreen свойства:
    let scale = UIScreen.main.scale // Коэффициент масштабирования
    let bounds = UIScreen.main.bounds // В точках
    let nativeBounds = UIScreen.main.nativeBounds // В пикселях
    

Рекомендации для разработчиков

  1. Всегда проектируйте интерфейсы в точках
  2. Используйте @1x, @2x, @3x ресурсы для изображений
  3. Помните о плотности пикселей при работе с Core Graphics
  4. Тестируйте на разных устройствах для проверки масштабирования

Использование точек в CGRect — это краеугольный камень системы координат iOS, который обеспечивает независимость от разрешения, единообразие интерфейсов на разных устройствах и плавное масштабирование графики. Это одна из тех фундаментальных концепций, понимание которой отличает начинающего разработчика от опытного специалиста.

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