我的 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/

10-14 20:32