考虑一个非标准的CGRect
具有负宽度和高度:
var rect = CGRect(x: 0.0, y: 0.0, width: -10.0, height: -10.0)
根据Apple文档,这是一个有效的矩形,因为“一个原点为[0.0, 0.0]
和大小为[10.0, 10.0]
完全等价于原点为的矩形[10.0, 10.0]
和大小为[-10.0, -10.0]
."
你可以标准化这个CGRect
通过调用遗留内联CGRectStandardize
像 Objective-C 中的方法,或者 Swift 扩展中提供的任何新方法CGRect
:
CGRectStandardize(rect) // {x -10 y -10 w 10 h 10}
rect.standardized // {x -10 y -10 w 10 h 10}
rect.standardizeInPlace() // {x -10 y -10 w 10 h 10}
可是等等!这将在坐标平面上重新定位您的矩形,不仅使您的宽度和高度为正值,而且使您的origin
负数反映矩形的初始位置及其负宽度和高度。
内联CGRectGet
函数提供了一个接口来规范化矩形的特定值,而不改变其原点。 Swift 提供了一个扩展CGRect
因此您可以直接访问标准化值,而不是使用由CGGeometry
:
var rect = CGRect(x: 0.0, y: 0.0, width: -10.0, height: -10.0)
rect.size.width // non-normalized, returns -10
CGRectGetWidth(rect) // bridged C function, normalized, returns 10
rect.width // new from Swift extension on CGRect, normalized, returns 10
新界面:
extension CGRect {
// ...
public var width: CGFloat { get }
public var height: CGFloat { get }
public var minX: CGFloat { get }
public var midX: CGFloat { get }
public var maxX: CGFloat { get }
public var minY: CGFloat { get }
public var midY: CGFloat { get }
public var maxY: CGFloat { get }
// ...
}
所以答案是肯定的,同样的规则CGRect
Objective-C 中的内容也适用于 Swift 中。这里唯一的区别是 Swift 提供了一些扩展CGGeometry
结构体允许您摆脱旧的内联 C 函数桥接CGGeometry
标头。