17

CGSize 和 CGRect 有什么区别?

作为一个阅读CGGeometry 参考的初学者,这并不是很明显,特别是因为其中提到了 size 是一个向量。我有点惊讶我在 StackOverflow 上找不到这个基本问题,所以我决定对其进行更多研究并在下面发布我的答案。

4

2 回答 2

31

CGS尺寸

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

在此处输入图像描述

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

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

其中CGFloatfloat(32 位)或double(64 位)。(请参阅使用 CGFloat 和 float 有什么区别?

您可以CGSize通过执行以下操作来制作:

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

CG矩形

CGRect是一个矩形。但是,从名称中并没有立即显而易见的是,除了宽度和高度之外,它还有一个起源。

在此处输入图像描述

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. 注意原点如何出现在不同的角落:

在此处输入图像描述

矢量图

CGSize的文档说

CGSize结构有时用于表示距离向量,而不是物理大小。作为一个向量,它的值可以是负数。要规范化CGRect结构以使其大小由正值表示,请调用该CGRectStandardize函数。

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

在此处输入图像描述

延伸阅读

于 2015-06-05T03:48:20.510 回答
8

简短版本:它们的名称令人困惑,因为它们都可以用来表示矩形。

CGSize有宽度和高度

在此处输入图像描述

CGRect有 x, y, width 和 height

在此处输入图像描述

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

CGRect 通常用于指定一个 UIView 框架,其(上、左)坐标是相对于父视图的(上、左)坐标。

在此处输入图像描述

于 2016-08-17T02:46:00.243 回答