Где находится начало системы координат (0,0) в UIKit?

Ответ

В UIKit начало системы координат (origin) находится в верхнем левом углу.

Основные правила:

  1. Ось X: Увеличивается вправо.
  2. Ось Y: Увеличивается вниз.

Пример размещения view:

// View будет расположен в 50 пунктах от левого края
// и в 100 пунктах от верхнего края родительской view
let blueView = UIView(frame: CGRect(x: 50, y: 100, width: 120, height: 80))
parentView.addSubview(blueView)

Важные нюансы:

  • Система координат относительна. Координаты UIView задаются относительно границ (bounds) ее супервью (родителя).
  • Исключение — UIWindow: Его система координат привязана к физическому экрану устройства, с началом в верхнем левом углу с учетом ориентации.
  • Отличие от Core Graphics: В некоторых низкоуровневых контекстах Core Graphics (например, при рисовании в CGContext) начало координат по умолчанию может быть в нижнем левом углу. UIKit автоматически настраивает контекст в draw(_:), чтобы согласовать это.

Практическое следствие: При вычислении позиций помните, что view.frame.origin.y = 0 означает «прижат к верху родителя», а не ко дну.

Ответ 18+ 🔞

Да ты посмотри, какая интересная хуйня! Всё-таки эти яблочники — ребята с приколом. Ну, то есть, не то чтобы с приколом, а просто у них в голове своя атмосфера, блядь.

Вот смотри, берёшь ты UIKit, эту древнюю, мать её, библиотеку для айфонов. И там, сука, система координат — просто ёперный театр! Начало всего, точка отсчёта, этот самый origin — он сидит, блядь, в левом верхнем углу. Как будто так и надо, как будто все так живут.

И правила, блядь, простые, как три копейки:

  1. Ось X: Ползёт, сука, вправо. Логично, вроде.
  2. Ось Y: А вот эта ось, блядь, она вниз увеличивается! Не вверх, как нормальные люди в школе учили, а вниз! Прямо как моё настроение, когда я с утра код читаю.

Вот, например, хочешь ты view поставить. Делаешь так:

// Эта синяя хрень встанет в 50 точках от левого края
// и в 100 точках от ВЕРХНЕГО края той view, куда её пихаешь
let blueView = UIView(frame: CGRect(x: 50, y: 100, width: 120, height: 80))
parentView.addSubview(blueView)

И она, зараза, прилипнет к верху, а не к низу. Запомни это, а то будешь потом ебаться, почему всё не там, где надо.

А теперь, внимание, главный пиздец, из-за которого все путаются! Система-то эта — она относительная, блядь! Твои координаты (x: 50, y: 100) — это не от края экрана, а от границ её родителя (superview.bounds). Как будто ты внутри коробки сидишь и от её стенок отсчёт ведёшь.

Окно (UIWindow) — это отдельная песня, у него координаты уже к физическому экрану привязаны, но начало всё равно там же, слева сверху.

А вот самый сок, где все обоссываются! Есть ещё Core Graphics, низкоуровневая хуйня для рисования. Так там, в некоторых контекстах, начало координат — в левом нижнем углу, как у приличных людей! Но UIKit, такой весь из себя хороший, в методе draw(_:) обычно сам контекст переворачивает, чтобы твою голову не ебать. Но если полезешь куда не надо — получишь, блядь, сюрприз.

Итог, коротко и ясно: Хочешь view к верху прижать — делай y = 0. Хочешь к низу — придётся, сука, считать: parentHeight - viewHeight. Волнение ебать, но так уж заведено. Привыкай, или иди в SwiftUI, там вроде попроще. Хотя... там свои тараканы.