【问题标题】:How does - (CGRect)convertRect:(CGRect)rect toView:(UIView *)view work- (CGRect)convertRect:(CGRect)rect toView:(UIView *)view 如何工作
【发布时间】:2011-03-23 21:03:39
【问题描述】:

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

每次我尝试使用它们时,我都会发现自己在尝试不同方面时摸不着头脑,但它似乎从来没有达到我的预期。

为了争论,我正在尝试转换从 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}}

任何帮助将不胜感激:)

【问题讨论】:

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


    【解决方案1】:

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

    您的窗口中有两个子视图,一个带有 {{25,0}, {100, 100}} 的框架,另一个带有 {{50, 50}, {200, 200}} 的框架要将以下矩形 {{50, 50}, {50, 50}} 从第一个子视图翻译到第二个子视图。以下是它的工作原理。

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

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

    3. 的翻译矩形

    【讨论】:

    • 我了解转换的工作原理。但是,我试图了解这些特定方法是如何工作的。我用 [self.window convertRect:[[[notif userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromWindow:nil];为了使它工作。如果您查看以下链接developer.apple.com/iphone/library/documentation/uikit/…:它提到了它的行为方式,但不太清楚到底发生了什么
    • 在您的情况下,您想使用 convertRect:fromView: not convertRect:toView: 所以 [self convertRect:rect fromView:nil] 将采用边界,即屏幕坐标并将其转换为您的本地查看坐标。
    猜你喜欢
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    相关资源
    最近更新 更多