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

Pie*_*ult 9 iphone cocoa-touch objective-c uikit ipad

我一直在使用这种方法,但从未真正了解它们的行为方式.

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

为了争论,我试图转换我从UIKeyboard的通知中得到的帧.

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

UIKeyboardFrameEndUserInfoKey = NSRect: {{406, 0}, {362, 1024}}
Run Code Online (Sandbox Code Playgroud)

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

CGRect compatibleRect = [self convertRect:[[[notif userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] toView:nil];
Run Code Online (Sandbox Code Playgroud)

但是矩形成为:

compatibleRect = CGRect: {{406,406}, {362, 1024}}
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激 :)

Elf*_*red 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}}

  • 在你的情况下你想使用convertRect:fromView:not convertRect:toView:so [self convertRect:rect fromView:nil]将获取边界,即在屏幕坐标中并将其转换为本地视图坐标. (4认同)
  • 我了解转化的工作原理.但是,我试图了解这些特定方法的工作原理.我用[self.window convertRect:[[[notif userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromWindow:nil]; 为了使它工作.如果您查看以下链接http://developer.apple.com/iphone/library/documentation/uikit/reference/UIWindow_Class/UIWindowClassReference/UIWindowClassReference.html#//apple_ref/occ/instm/UIWindow/convertRect:fromWindow:It提到它的行为方式,但目前尚不清楚究竟发生了什么 (2认同)