手动旋转左侧横向模式的坐标系

时间:2013-04-23 22:43:49

标签: ios objective-c cgaffinetransform

我知道屏幕的左上角(假设手机左侧是横向)是(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);

如上所示,使用-90度指定CGAffineTransformMakeRotation调用应该会改变坐标系,但不会改变坐标系。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:-1)

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

有两个简单的修复方法:

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

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

其他小问题

  • 你应该使用实际的宽度和高度而不是320和480的硬编码。记得检查“Retina”和“Retina 4英寸”。
  • self.view.transform = CGAffineTransformIdentity;没有意义,因为你立刻用写字来破坏它。在下一行。

如果确实需要来设置视图的转换,请将其设为VC视图的子视图。另请注意,如果您设置了转换,某些视图无法正常工作(例如,某些版本的iOS上的UITableView使用其框架来决定应该使用其边界时应该有多宽的单元格。需要像这样的视图结构并不罕见:

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

毋庸置疑,我尽可能避免这种情况。