有人可以解释 CGRectGetMaxX 和 CGRectIntersection 的结果吗?
Posted
技术标签:
【中文标题】有人可以解释 CGRectGetMaxX 和 CGRectIntersection 的结果吗?【英文标题】:Can someone explain the result of CGRectGetMaxX and CGRectIntersection? 【发布时间】:2014-09-19 16:28:42 【问题描述】:场景
假设有两个不相交的矩形,宽 10 磅,高 5 磅。以下模式中的 x/y 值表示两个矩形角点的坐标。
x/y = 0/0 +------------------+ x/y = 9/0
| |
| |
| |
| |
x/y = 0/4 +------------------+ x/y = 9/4
x/y = 0/5 +------------------+ x/y = 9/5
| |
| |
| |
| |
x/y = 0/9 +------------------+ x/y = 9/9
以下是设置这些矩形的代码:
CGRect rect1 = CGRectMake(0.0f, 0.0f, 10.0f, 5.0f);
CGRect rect2 = CGRectMake(0.0f, 5.0f, 10.0f, 5.0f);
CGRectGetMaxX
CGRectGetMaxX
Core Graphics 函数的返回值记录如下:
矩形 x 坐标的最大值。
这里是使用函数的代码sn-p:
CGFloat maxX = CGRectGetMaxX(rect1);
根据文档,我预计 maxX
是 9。但是,maxX
是 10。嗯?
CGRectIntersection
CGRectIntersection
Core Graphics 函数的返回值记录如下:
表示两个指定矩形相交的矩形。如果两个矩形不相交,则返回空矩形。要检查这种情况,请使用 CGRectIsNull。
这里是使用函数的代码sn-p:
CGRect intersectionRect = CGRectIntersection(rect1, rect2);
bool intersectionRectIsNull = CGRectIsNull(intersectionRect);
根据文档,我希望 intersectionRectIsNull
是真的,因为 rect1
和 rect2
显然不相交。但是,intersectionRectIsNull
是错误的。啊???
如果我们在调试器中检查intersectionRect
,我们会看到:
(CGRect) $0 = origin=(x=0, y=5) size=(width=10, height=0)
是的,所以现在很清楚为什么 CGRectIsNull
返回 false,但到底为什么 intersectionRect
不是这个?
(CGRect) $0 = origin=(x=+Inf, y=+Inf) size=(width=0, height=0)
问题
有人能解释为什么这些函数的文档没有错吗?我一定是错过了什么,但我一辈子都看不到它是什么。
【问题讨论】:
【参考方案1】:您的图表不正确。它与您的 CGRectMake
呼叫不匹配。
一个 10 宽、原点为 0 的矩形的最大 X 为 10,就像你得到的一样。
图表中的9
应为10
,图表中的4
应为5
。
鉴于对CGRectMake
的两次调用,这两个矩形共享一个公共边。他们之间没有差距。
请记住,0 + 10 是 10,而不是 9,0 + 5 是 5,而不是 4。
【讨论】:
嗯?CGRectMake(0, 0, 10, 5)
说矩形是 10 点宽,从坐标 0 开始。所以第一个点在坐标 0,第二个点在坐标 1,第三个点在坐标 2,[...],第十个点在坐标 9。不是吗?
@herzbube No. 宽度/高度不能用单个“点”表示,您需要有两个点来计算距离以确定这些测量值。像任何其他高度/宽度测量一样考虑它。从 0 英尺到 1 英尺的距离是 1 英尺,即使你说的是两个“点”。因此,在您的情况下,它是 10 点宽 - (0->1, 1->2, 2->3....9->10),即 10 个值。以上是关于有人可以解释 CGRectGetMaxX 和 CGRectIntersection 的结果吗?的主要内容,如果未能解决你的问题,请参考以下文章
iOS开发CGRectGetMidX. CGRectGetMidY.CGRectGetMinY. CGRectGetMaxY. CGRectGetMinX. CGRectGetMaxX的使用(代码片段
iOS开发CGRectGetMidX. CGRectGetMidY.CGRectGetMinY. CGRectGetMaxY. CGRectGetMinX. CGRectGetMaxX的使用(代码片段