iPhone正确的景观窗口坐标

时间:2011-05-17 17:16:40

标签: iphone window coordinates landscape

我正在尝试使用以下代码获取表格视图的窗口坐标:

[self.tableView.superview convertRect:self.tableView.frame toView:nil]

在纵向模式下报告正确的坐标,但当我旋转到横向时,它不再报告正确的坐标。首先,它会翻转x,y坐标以及宽度和高度。但这不是真正的问题。真正的问题是坐标不正确。在纵向中,表格视图框架的窗口坐标为{{0,114},{320,322}},而在横向中,窗口坐标为{{32,0},{204,480}}。显然这里的x值是不正确的,对吧?不应该是84吗?我正在寻找一个解决这个问题的方法,如果有人知道如何在横向模式下获得视图的正确窗口坐标,如果您愿意与我分享这些知识,我将不胜感激。

以下是一些屏幕截图,以便您查看视图布局。

肖像:http://i.stack.imgur.com/IaKJc.png

风景:http://i.stack.imgur.com/JHUV6.png

4 个答案:

答案 0 :(得分:6)

我发现了我认为是解决方案的开端。您和我看到的坐标似乎是基于左下角或右上角,具体取决于方向是UIInterfaceOrientationLandscapeRight还是UIInterfaceOrientationLandscapeLeft。

我不知道为什么,但希望这会有所帮助。 :)

[UPDATE] 所以我猜在正常人像模式下窗口的原点是0,0,并随着ipad / iphone旋转。

所以这就是我解决这个问题的方法。

首先,我在窗口内抓住我的方向,窗口边界和视图的矩形(带有不稳定的坐标)

UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
CGRect windowRect = appDelegate.window.bounds;
CGRect viewRectAbsolute = [self.guestEntryTableView convertRect:self.guestEntryTableView.bounds toView:nil];

然后,如果方向是横向,我会反转x和y坐标以及宽度和高度

if (UIInterfaceOrientationLandscapeLeft == orientation ||UIInterfaceOrientationLandscapeRight == orientation ) {
    windowRect = XYWidthHeightRectSwap(windowRect);
    viewRectAbsolute = XYWidthHeightRectSwap(viewRectAbsolute);
}

然后,无论ipad / iphone是否旋转,我都会调用我的功能来固定原点为左上角。 它根据0,0当前居住的位置(取决于方向)确定原点

viewRectAbsolute = FixOriginRotation(viewRectAbsolute, orientation, windowRect.size.width, windowRect.size.height);

以下是我使用的两个功能

CGRect XYWidthHeightRectSwap(CGRect rect) {
    CGRect newRect;
    newRect.origin.x = rect.origin.y;
    newRect.origin.y = rect.origin.x;
    newRect.size.width = rect.size.height;
    newRect.size.height = rect.size.width;
    return newRect;
}

CGRect FixOriginRotation(CGRect rect, UIInterfaceOrientation orientation, int parentWidth, int parentHeight) {
    CGRect newRect;
    switch(orientation)
    {
        case UIInterfaceOrientationLandscapeLeft:
            newRect = CGRectMake(parentWidth - (rect.size.width + rect.origin.x), rect.origin.y, rect.size.width, rect.size.height);
            break;
        case UIInterfaceOrientationLandscapeRight:
            newRect = CGRectMake(rect.origin.x, parentHeight - (rect.size.height + rect.origin.y), rect.size.width, rect.size.height);
            break;
        case UIInterfaceOrientationPortrait:
            newRect = rect;
            break;
        case UIInterfaceOrientationPortraitUpsideDown:
            newRect = CGRectMake(parentWidth - (rect.size.width + rect.origin.x), parentHeight - (rect.size.height + rect.origin.y), rect.size.width, rect.size.height);
            break;
    }
    return newRect;
}

答案 1 :(得分:3)

这是一个黑客,但它对我有用:

UIView *toView = [UIApplication sharedApplication].keyWindow.rootViewController.view;
[self.tableView convertRect:self.tableView.bounds toView:toView];

我不确定这是最好的解决方案。如果根视图控制器不支持与当前视图控制器相同的方向,则它可能无法可靠地工作。

答案 2 :(得分:0)

您应该能够从self.tableView.bounds

获取当前表格视图坐标

答案 3 :(得分:0)

您的代码应为:

[tableView convertRect:tableView.bounds toView:[UIApplication sharedApplication].keyWindow];

这将为您提供窗口坐标系中视图的矩形。一定要使用“边界”而不是“框架”。 frame是其父视图坐标系中视图的矩形。 “bounds”是其自身系统中的视图矩形。所以上面的代码要求表视图将自己的矩形从自己的系统转换为窗口的系统。您之前的代码要求表的父视图将表的矩形从父坐标系转换为空。