В каких единицах измерения работает CGPoint в iOS/macOS?

Ответ

CGPoint оперирует точками (points), а не физическими пикселями.

  • Точка (point) — это независимая от разрешения абстрактная единица в системе координат Core Graphics.
  • Масштабирование точек в пиксели (pixels) выполняется автоматически системой с учетом масштабного коэффициента (scale factor) экрана.
    • Стандартный экран: 1 point = 1 pixel (scale 1.0).
    • Retina экран: 1 point = 2 pixels (scale 2.0) или 3 pixels (scale 3.0).

Пример и вывод:

let origin = CGPoint(x: 10, y: 20)
print(origin) // (10.0, 20.0) - это точки (points)

// На iPhone с Retina (scale 2.0) эти координаты займут:
// 10 points * 2.0 = 20 pixels по оси X
// 20 points * 2.0 = 40 pixels по оси Y

Практическое правило: Всегда проектируйте UI и анимации, работая с точками. Система сама позаботится о четком отображении на экранах с разной плотностью пикселей.

Ответ 18+ 🔞

Да ты посмотри на эту дичь! Сидишь ты такой, пишешь свой UI, думаешь: "Вот, блядь, поставлю кнопку на координаты (10, 20) – и будет она сидеть, как влитая". А потом оказывается, что на старом айфоне она – одно, а на новом, с этими ебучими ретинами, – совсем другое! И ты сидишь и думаешь: "Ну что за пиздец, я же вроде координаты правильно указал?"

А всё потому, что ты, дружок, путаешь точки (points) с пикселями (pixels). Это, блядь, как сравнивать метры с нанометрами, только в мире айфонов.

Вот смотри. CGPoint – это не про физические пиксели на экране. Это про абстрактные, ебушки-воробушки, точки в системе координат. А уже система, эта хитрая жопа, сама решает, сколько реальных пикселей под одну такую точку подсунуть.

И решает она это с помощью масштабного коэффициента (scale factor). Это такая магическая цифра:

  • На старом добром экране (scale 1.0): 1 точка = 1 пиксель. Всё просто, как три копейки.
  • А на Retina-экране (scale 2.0 или 3.0): 1 точка = 2 или 3 пикселя! Вот тебе и развод, блядь! Система берёт твою одну точку и рисует её двумя или тремя пикселями, чтобы всё было чётко и не размыто.

Смотри, как это работает на практике:

let origin = CGPoint(x: 10, y: 20)
print(origin) // (10.0, 20.0) - это точки (points), Карл!

А теперь включаем мозг. Если этот код выполнится на iPhone с Retina (scale 2.0), то:

  • По оси X: 10 points * 2.0 = 20 реальных, физических pixels.
  • По оси Y: 20 points * 2.0 = 40 реальных, физических pixels.

Вот и весь секрет, ёпта! Ты работаешь с абстрактными точками, а система, эта умная сука, сама всё пересчитывает под конкретный экран.

Главное правило, которое надо вбить себе в башку: Проектируй интерфейсы и анимации, оперируя точками (points). Забудь про пиксели, как про страшный сон. Система сама, блядь, разберётся, как это красиво и чётко отобразить на любом экране, будь он трижды ретина. Расслабься и получай удовольствие.