Разница между CGSize и CGRect

В чем разница между CGSize и CGRect?

Для новичка, читающего CGGeometry Reference, это было не сразу очевидно, особенно потому, что там были ссылки на размер, являющийся вектором. Я был немного удивлен, что не смог найти этот основной вопрос в StackOverflow, поэтому решил изучить его подробнее и опубликовать свой ответ ниже.


person Suragch    schedule 05.06.2015    source источник


Ответы (2)


CGSize

CGSize - ширина и высота. Технически это не считается прямоугольником (это одна из причин, по которой я сначала перепутал его с CGRect), а скорее просто размером. Однако для иллюстрации я представлю его в виде прямоугольника ниже:

введите описание изображения здесь

Эта комбинация ширины и высоты известна как структура, что является сокращением от структуры, и первоначально происходит из языка C (но здесь я буду использовать синтаксис Swift, а не Objective C). Структура - это просто группа логически связанных переменных. Здесь мы видим структуру CGSize:

struct CGSize {
  var width: CGFloat
  var height: CGFloat
}

где CGFloat - это либо float (32 бит), либо double (64 бит). (См. Какая разница между использованием CGFloat и float?)

Вы можете сделать CGSize, выполнив следующие действия:

var size = CGSize(width: 50, height: 30)

CGRect

CGRect - прямоугольник. Что не сразу видно из названия, так это то, что помимо ширины и высоты оно также имеет происхождение.

введите описание изображения здесь

CGsize, для сравнения, не имеет происхождения.

CGRect также является структурой. На самом деле, это структура структур: CGPoint (начало) и CGSize (ширина и высота). Вот:

struct CGRect {
  var origin: CGPoint
  var size: CGSize
}

где CGPoint

struct CGPoint {
  var x: CGFloat
  var y: CGFloat
}

Вы можете сделать CGRect, выполнив следующие действия:

var rect = CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: 50, height: 30))

Отрицательная ширина и высота

Значения ширины и высоты могут быть отрицательными. Мы можем увидеть, как это выглядит с CGRect. Обратите внимание, как начало координат появляется в разных углах:

введите описание изображения здесь

Векторы

Документация для CGSize говорит

Структура CGSize иногда используется для представления вектора расстояния, а не физического размера. Как вектор, его значения могут быть отрицательными. Чтобы нормализовать структуру CGRect, чтобы ее размер был представлен положительными значениями, вызовите функцию CGRectStandardize.

Векторы в математике имеют величину (или длину) и направление. Хотя CGSize не имеет начала координат, на следующей диаграмме видно, как ширина и высота вместе с соответствующими положительными или отрицательными значениями дают длину и направление.

введите описание изображения здесь

Дальнейшее чтение

person Suragch    schedule 05.06.2015
comment
Отличное объяснение! - person Haileapp; 18.12.2017

Краткая версия: их имена сбивают с толку, потому что они оба могут использоваться для обозначения прямоугольников.

CGSize имеет ширину и высоту.

введите описание изображения здесь

CGRect имеет x, y, ширину и высоту.

введите описание изображения здесь

Вы можете думать о CGRect как о CGSize с координатами.

CGRect обычно используется для указания кадра UIView, координаты которого (вверху, слева) относительно координат (вверху, слева) родительского представления.

введите описание изображения здесь

person tothemario    schedule 17.08.2016