手动向左旋转横向模式的坐标系
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
使用其框架来决定当它应该使用其边界时单元格的宽度)。需要这样的视图结构并不少见:
UITableView
)您未设置其变换。
不用说,我尽量避免这种情况。
【讨论】:
完美解决方案!我按照您的建议更换了 glothof,效果很好,真不敢相信我错过了。是的,硬编码的 320 和 480 只是因为我很着急,但我肯定会改变它。非常感谢以上是关于手动向左旋转横向模式的坐标系的主要内容,如果未能解决你的问题,请参考以下文章