iphone - 如何 - (CGRect)convertRect :(CGRect)rect toView:(UIView *)view work

标签 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}}

任何帮助将不胜感激:)

最佳答案

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

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

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

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

关于iphone - 如何 - (CGRect)convertRect :(CGRect)rect toView:(UIView *)view work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3382316/

相关文章:

iOS 配置 - 如果我创建临时配置,它会破坏应用商店中现有应用的 APN 吗?

iphone - iPhone 上的 "standard"PNG 需要支付很多罚款吗?

iphone - 开发 iPhone/iPad 应用程序时要考虑的 iOS 版本

ios - 如何减少我的应用程序的 ipa 大小

objective-c - 为什么UI绘制在主线程上?

ios - 键/值有效地保存到很多键

iphone - 使用渐变背景设置 UITableViewCells 样式

iphone - 如何通过一系列 View Controller 来保存用户的选择?

iphone - UITableView 背景图像 Alpha 问题

iphone - 为什么这段代码会给我一个关于弱属性的错误?