0

我知道屏幕的左上角(假设手机横向放置)是(0,0)。但是,如果我希望我的 (0,0) 点位于左下角而不是左上角,我该怎么做?

我正在尝试使用 OpenGL 在我当前在屏幕上触摸的指定位置绘制对象,但 y 值被绘制在屏幕的错误一侧。如果有帮助,这是该问题的图片示例。请注意,白色的点是我“触摸”屏幕的地方,紫色的东西是我使用 OpenGL 绘制的粒子系统。

https://www.dropbox.com/s/n2lhzfdbp4audi2/iOS%20Simulator%20Screen%20shot%20Apr%2023%2C%202013%206.25.49%20PM.png

https://www.dropbox.com/s/foueopvlgfu03vs/iOS%20Simulator%20Screen%20shot%20Apr%2023%2C%202013%206.25.53%20PM.png

我这样设置我支持的界面:

- (NSUInteger)application:(UIApplication*)application supportedInterfaceOrientationsForWindow:(UIWindow*)window
{
    return UIInterfaceOrientationMaskAllButUpsideDown;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscapeLeft;
}

在我的drawFrame方法中:

glViewport(0, 0, 480, 320);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glOrthof(0.0f, 480, 0.0f, 320, -100.0f, 100.0f);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

//render the particles being drawn, etc

在我的touchesBegan方法中:

UITouch *touch = [[event allTouches] anyObject];
CGPoint location = [touch locationInView:touch.view];

if (pe.active != YES)
{
    pe.active = YES;

    NSLog(@"x: %f y: %f", location.x, location.y);

    pe.sourcePosition = Vector2fMake(location.x, location.y);
}

然后我尝试通过在我的viewWillAppear方法中执行此操作手动将坐标系旋转 90 度:

self.view.transform = CGAffineTransformIdentity;
self.view.transform = CGAffineTransformMakeRotation((M_PI * (-90) / 180.0));
self.view.bounds = CGRectMake(0.0, 0.0, 480, 320);

指定CGAffineTransformMakeRotation调用应该会改变坐标系,但不会。

任何帮助是极大的赞赏。

4

1 回答 1

-1

通常,您应该避免设置 VC 的视图框架、边界和变换。这些由 UIKit 自动设置以处理旋转和调整大小(例如,用于通话状态栏)。

有两个简单的修复:

  • 变换接触点 ( location.x, height-location.y)
  • glOrthof(0, width, height, 0, ...)在投影矩阵 ( )中使用左上角原点。您可能不得不担心坐标系的手性。

我目前更喜欢第二种选择:当使用尽可能少的坐标系时,事情就不会那么混乱了。

其他小问题

  • 您应该使用实际的宽度和高度,而不是硬编码 320 和 480。请记住还要检查“Retina”和“Retina 4-inch”。
  • self.view.transform = CGAffineTransformIdentity;毫无意义,因为您立即用写操作破坏了它。在下一行。

如果真的需要设置视图的变换,就让它成为VC的视图的子视图另请注意,如果您设置它们的变换,某些视图将无法正常工作(例如UITableView,在某些版本的 iOS 上,使用它的框架来决定当它应该使用它的边界时单元格应该有多宽)。需要这样的视图结构并不少见:

  • 外部容器(其框架/变换由例如 UIKit 设置)
    • 内部容器(这是您设置变换的地方)
      • 您关心的实际视图(例如UITableView)您未设置其变换的视图。

不用说,我尽量避免这种情况。

于 2013-04-24T01:59:34.337 回答