CGSize 和 CGRect 的区别

Difference between CGSize and CGRect

CGSize 和 CGRect 有什么区别?

作为阅读 CGGeometry Reference 的初学者,它并不是很明显,特别是因为其中提到大小是一个向量。我有点惊讶我在 Whosebug 上找不到这个基本问题,所以我决定进一步研究它并 post 我的答案在下面。

CGSize

CGSize是宽度和高度。它在技术上不被视为矩形(这是我一开始将它与 CGRect 混淆的原因之一),而只是一个大小。但是,为了便于说明,我将其表示为下面的矩形:

这种width和heigh的组合被称为struct,structure的缩写,最初来自C语言(但我将使用Swift而不是Objective C语法这里)。结构只是一组逻辑上相关的变量。这里我们可以看到CGSize结构:

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

其中 CGFloatfloat(32 位)或 double(64 位)。 (参见 What's the difference between using CGFloat and 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 看到它的样子。注意原点如何出现在不同的角上:

向量

documentation for CGSize 表示

A CGSize structure is sometimes used to represent a distance vector, rather than a physical size. As a vector, its values can be negative. To normalize a CGRect structure so that its size is represented by positive values, call the CGRectStandardize function.

Vectors 在数学中有大小(或长度)和方向。虽然 CGSize 没有原点,但您可以从下图中看出宽度和高度及其关联的正值或负值如何给出长度和方向。

进一步阅读

简短版:它们的名字很容易混淆,因为它们都可以用来表示矩形。

CGSize 有宽度和高度

CGRect 有 x、y、宽度和高度

您可以将 CGRect 视为带坐标的 CGSize。

CGRect常用来指定一个UIView框架,其(top,left)坐标是相对于父view的(top,left)坐标。