3

我创建了一个新项目作为单视图应用程序。在视图控制器中添加了用于将视图坐标转换为窗口坐标的代码:

- (void) dumpFrame
{
    CGRect bounds = self.view.bounds;

    // UIView* rootView = [UIApplication sharedApplication].keyWindow.rootViewController.view;
    // I tried rootView instead of nil and self.view.superview instead of self.view but got {0,0} coordinate

    CGPoint newCoord = [self.view convertPoint: bounds.origin
                                        toView: nil];

    bounds.origin.x = newCoord.x;
    bounds.origin.y = newCoord.y;
    NSLog(@"view.frame=%@", NSStringFromCGRect(bounds));
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    [super didRotateFromInterfaceOrientation: fromInterfaceOrientation];
    NSLog(@"===>didRotate");
    [self dumpFrame];
}

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    [super willRotateToInterfaceOrientation: toInterfaceOrientation duration: duration];
    NSLog(@"===>willRotate");
    [self dumpFrame];
}

我的日志:

===>wilRotate
view.frame={{0, 20}, {768, 1004}}
===>didRotate
view.frame={{748, 0}, {1024, 748}}

代替

{{0, 20}, {1024, 748}}

我有

{{748, 0}, {1024, 748}}

旋转后。我需要做什么才能获得 {0,20}?我会很高兴任何帮助。

4

2 回答 2

3

显然UIWindow' 的坐标系始终保持纵向,只需设置' 的根 VC的transform属性即可应用旋转。从这个 SO questionUIWindow中得到了这个信息。

至少这解释了为什么你会得到意想不到的坐标。然而,不幸的是,我一直无法找到一种方法来实际解决您的问题。我认为应该有一种方法可以利用有效的转换矩阵,但我的数学技能达不到这个水平。也许其他人可以介入这里。

编辑

也许你可以用这段代码做点什么(在“iOS Developer's Cookbook”的 GitHub 存储库中)。本文对部分代码进行了解释和说明。

于 2013-07-05T14:43:13.743 回答
-1

尝试:

CGPoint newCoord = [view.superview convertPoint: bounds.origin
                               toView: nil];

视图的原点是相对于其父视图的,因此您必须从父视图坐标系转换该点

于 2013-07-02T14:19:30.307 回答