我的 iPhone 应用程序中有一个简单的屏幕,我希望屏幕底部有一个 320x100 的矩形来捕捉触摸。这是我在 touchesBegan:withEvent
中的代码:
for (UITouch *touch in touches) {
CGPoint touchPoint = [touch locationInView:self.view];
NSLog(@"touch @ %f, %f", touchPoint.x, touchPoint.y);
// build a rectangle where we want to capture a URL tap
CGRect rectangle = CGRectMake(0, 480, 320, 100);
NSLog(@"midX, midY = %f, %f", CGRectGetMidX(rectangle), CGRectGetMidY(rectangle));
// check to see if they tapped the URL
if (CGRectContainsPoint(rectangle, touchPoint)) {
NSLog(@"You touched inside the rectangle.");
}
}
现在这段代码没有按预期工作……来自矩形中点的日志显示我的矩形是在
midX, midY = 160.000000, 530.000000
处构建的。根据 CGPoint 文档,原点 (0, 480)
是左下角,但这就像原点是左上角一样。当我将矩形的原点更改为 0, 380 时,一切都按预期工作。也许今天早上我还没有适本地摄入咖啡因,但为什么我看到文档和执行之间存在这种差异?
最佳答案
原点是在左上角还是左下角实际上取决于坐标系。
在 UIKit 中,(0, 0) 在左上角,y 轴向下增长。
在 CoreGraphics 中,(0, 0) 在左下角,y 轴向上增长。为了适应 UIKit 的 CG,默认情况下会应用垂直反射,这就是为什么如果您直接使用 -drawRect:
中的 CG 函数绘制图像或字符串,您会将它们颠倒过来。
在您的情况下,您从 UIKit API 获取点和矩形,因此原点位于左上角。
关于objective-c - CGRectMake中矩形的原点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2177207/