我知道屏幕的左上角(假设手机左侧是横向)是(0,0)。但是,如果我希望我的(0,0)点是左下角而不是左上角,我该怎么做?
我正在尝试使用OpenGL在我当前在屏幕上触摸的指定位置绘制对象,但是y值正在屏幕的错误一侧绘制。下面是一个问题的图片示例,如果它有帮助。请注意,白色斑点是我触摸屏幕的位置,紫色的东西是我使用OpenGL绘制的粒子系统。
我设置了支持的界面:
- (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
调用应该会改变坐标系,但不会改变坐标系。
非常感谢任何帮助。
答案 0 :(得分:-1)
通常,您应该避免设置VC的视图框,边界和变换。这些由UIKit自动设置,以处理旋转和调整大小等内容(例如,对于通话状态栏)。
有两个简单的修复方法:
location.x, height-location.y
)glOrthof(0, width, height, 0, ...)
)中使用左上角原点。您可能不得不担心坐标系的灵活性。我目前更喜欢第二种选择:当使用的坐标系尽可能少时,事情就会变得更加混乱。
其他小问题
self.view.transform = CGAffineTransformIdentity;
没有意义,因为你立刻用写字来破坏它。在下一行。如果确实需要来设置视图的转换,请将其设为VC视图的子视图。另请注意,如果您设置了转换,某些视图无法正常工作(例如,某些版本的iOS上的UITableView
使用其框架来决定应该使用其边界时应该有多宽的单元格。需要像这样的视图结构并不罕见:
UITableView
),您未设置其转换。毋庸置疑,我尽可能避免这种情况。