Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 直接访问CGRect值还是在Swift-Objective-C规则中对其进行规范化仍然有效?_Ios_Swift_Core Graphics_Cgrect - Fatal编程技术网

Ios 直接访问CGRect值还是在Swift-Objective-C规则中对其进行规范化仍然有效?

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

这个问题的灵感来源于之前一个关于Swift中新的
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
取代