Apple Docs for CGGeometry说:
… your applications
should avoID directly reading and writing the data stored in the
CGRect data structure. Instead,use the functions described here to
manipulate rectangles and to retrIEve their characteristics.
Apple建议不直接访问CGRect中的数据仍然对Swift有效吗?为什么要使用CGRectGetMIDX,CGRectGetWIDth等代替直接访问CGRect结构的值,当这些属性现在使用Swift在CGRect上的新扩展时公开?
解决方法 考虑具有负宽度和高度的非标准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].“
您可以通过调用Objective-C中的旧内联CGRectStandardize方法或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,height: -10.0)rect.size.wIDth // non-normalized,returns -10CGRectGetWIDth(rect) // brIDged C function,normalized,returns 10rect.wIDth // new from Swift extension on CGRect,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函数.
总结以上是内存溢出为你收集整理的ios – 直接访问CGRect值与在Swift中规范化它们 – Objective-C规则仍然有效吗?全部内容,希望文章能够帮你解决ios – 直接访问CGRect值与在Swift中规范化它们 – Objective-C规则仍然有效吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)