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

Posted

技术标签:

【中文标题】手动向左旋转横向模式的坐标系【英文标题】:Manually rotate the coordinate system for landscape mode left 【发布时间】:2013-04-23 22:43:49 【问题描述】:

我知道屏幕的左上角(假设手机横放左侧)为 (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 调用如上所示的-90 度应该会改变坐标系,但它不会。

非常感谢任何帮助。

【问题讨论】:

我没有看到任何 OpenGL。绘制时更改坐标系。 我已经编辑了我的问题并添加了图片以更好地解释我的问题,谢谢。 【参考方案1】:

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

有两个简单的修复:

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

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

其他小问题

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

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

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

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

【讨论】:

完美解决方案!我按照您的建议更换了 glothof,效果很好,真不敢相信我错过了。是的,硬编码的 320 和 480 只是因为我很着急,但我肯定会改变它。非常感谢

以上是关于手动向左旋转横向模式的坐标系的主要内容,如果未能解决你的问题,请参考以下文章

Windows Phone 中横向模式下的坐标

UIViewcontroller 在横向模式下保持纵向坐标

如何根据c ++数学中的方向获取坐标

无法在横向模式下点击 (x,y) 坐标

iPhone正确的横向窗口坐标

屏幕坐标和当前窗口坐标如何转换???