Ios 直接访问CGRect值还是在Swift-Objective-C规则中对其进行规范化仍然有效?
这个问题的灵感来源于之前一个关于Swift中新的Ios 直接访问CGRect值还是在Swift-Objective-C规则中对其进行规范化仍然有效?,ios,swift,core-graphics,cgrect,Ios,Swift,Core Graphics,Cgrect,这个问题的灵感来源于之前一个关于Swift中新的CGSize初始值设定项的问题 他们说: 。。。你的申请 应避免直接读取和写入存储在 CGRect数据结构。相反,请使用此处描述的函数 操纵矩形并检索其特征 苹果关于不直接访问CGRect中数据的建议对Swift仍然有效吗?当Swift在CGRect上的新扩展现在公开了这些属性时,为什么要使用cgrectmidx、cgrectwidth等来代替直接访问CGRect结构的值?考虑宽度和高度为负值的非标准CGRect: var rect = CGRec
CGSize
初始值设定项的问题
他们说:
。。。你的申请
应避免直接读取和写入存储在
CGRect数据结构。相反,请使用此处描述的函数
操纵矩形并检索其特征
苹果关于不直接访问
CGRect
中数据的建议对Swift仍然有效吗?当Swift在CGRect
上的新扩展现在公开了这些属性时,为什么要使用cgrectmidx
、cgrectwidth
等来代替直接访问CGRect
结构的值?考虑宽度和高度为负值的非标准CGRect
:
var rect = CGRect(x: 0.0, y: 0.0, width: -10.0, height: -10.0)
根据苹果文档,这是一个有效的矩形,因为“原点为[0.0,0.0]
且大小为[10.0,10.0]
的矩形与原点为[10.0,10.0]
且大小为[-10.0,-10.0]
的矩形完全相同。”
您可以通过调用Objective-C中的传统内联cgRectStandardized
方法或CGRect
的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}
等等这将在坐标平面上重新定位矩形,不仅使宽度和高度为正值,而且使原点为负值,以反映矩形的初始位置及其负宽度和高度
内联CGRectGet
函数提供了一个接口来规范化rect的特定值,而无需更改其原点。Swift在CGRect
上提供了一个扩展,因此您可以直接访问规范化值,而不是使用CGGeometry
提供的传统C方法:
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 }
// ...
}
因此答案是肯定的,Objective-C中的CGRect
规则同样适用于Swift。这里唯一的区别是Swift在一些CGGeometry
结构上提供了一个扩展,允许您远离从CGGeometry
头桥接的旧内联C函数。在Swift 3中,CGRectGetWidth()
被CGRect.width
取代