Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

CGSize

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

enter image description here

Эта комбинация ширины и высоты называется структурой, которая является короткой для структуры и первоначально исходит из языка 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 - прямоугольник. То, что не сразу видно из названия, заключается в том, что в дополнение к ширине и высоте оно также имеет начало.

enter image description here

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

CGRect также является структурой. Если факт, то это структура структур: a 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. Обратите внимание, как происхождение появляется в разных углах:

enter image description here

Векторы

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

Структура

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

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

enter image description here

Дополнительная литература

Ответ 2

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

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

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

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

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

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

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

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