怎么做 - (CGRect)convertRect:(CGRect)rect toView:(UIView *)查看工作

时间:2010-08-01 14:10:16

标签: iphone objective-c cocoa-touch ipad uikit

我一直在使用这种方法,但从未真正理解他们的行为方式。

每当我尝试使用它们时,我发现自己在黑暗中探索,因为我尝试了不同的方面,它似乎永远不会按照我的期望去做。

为了争论,我正在尝试转换我从UIKeyboard的通知中获得的帧。

在横向模式下,我得到了这个NSRect:

UIKeyboardFrameEndUserInfoKey = NSRect: {{406, 0}, {362, 1024}}

现在我想将它转换为正确的矩形(交换x / y,宽度和高度),所以我做

CGRect compatibleRect = [self convertRect:[[[notif userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] toView:nil];

但是矩形变为:

compatibleRect = CGRect: {{406,406}, {362, 1024}}

任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:13)

你错了。它基本上进行坐标转换。我假设它首先将rect从起始视图转换为窗口坐标,然后从窗口坐标转换回第二个视图的坐标系。这是一个例子。

您的窗口中有两个子视图,一个的框架为{{25,0},{100,100}},另一个的框架为{{50,50},{200,200}}您想要将以下rect {{50,50},{50,50}}从第一个子视图转换为第二个子视图。以下是它的工作原理。

  1. 将rect从第一个子视图的协调转换为窗口坐标: 由于我们开始的子视图具有{25,0}的原点,我们需要将其转换为窗口坐标。这可以通过将子视图的原点添加到rect的原点来完成,因此窗口坐标中的新rect是{{75,50},{50,50}}

  2. 将新的rect从窗口坐标转换为第二个子视图的坐标:我们从rect {{75,50},{50,50}}开始,第二个子视图的帧是{{50,50 },{200,200}}。现在我们将第二个子视图的原点减去rect来进行翻译。所以我们最终得到了{{25,0},{50,50}}的翻译矩形