1. 程式人生 > >iOS convertRect:view.frame toView: x 異常翻倍?

iOS convertRect:view.frame toView: x 異常翻倍?

nsstring self pan 習慣 sub nds cgrect 方法 gpo

項目中遇到過,故查資料自己寫Demo測試。

 1     UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
 2     scrollView.backgroundColor = [UIColor whiteColor];
 3     [self.view addSubview:scrollView];
 4     
 5     // 來源 view
 6     UIView *sourceView = [[UIView alloc] initWithFrame:CGRectMake(100
, 440, 100, 40)]; 7 sourceView.backgroundColor = [UIColor redColor]; 8 [scrollView addSubview:sourceView]; 9 10 // 目標 view 11 UIView *destinationView = [[UIView alloc] initWithFrame:CGRectMake(20, 100, 320, 100)]; 12 destinationView.backgroundColor = [UIColor greenColor]; 13 [self.view addSubview:destinationView];
14 15 label0:// 錯誤轉換 16 { 17 // 異常翻倍 目標x+|來源x-目標x|*2 目標y+|來源y-目標y|*2 18 CGRect rect = [sourceView convertRect:sourceView.frame toView:destinationView]; 19 NSLog(@"%@", NSStringFromCGRect(rect)); 20 21 // 兩種正確方法 22 // label3: [sourceView.superview convertRect:sourceView.frame toView:destinationView];
23 // label1: [sourceView convertRect:sourceView.bounds toView:destinationView]; 24 // 對convertRect 調用者理解有誤,應該是需要轉換控件的參考系視圖,而不是自身。 25 } 26 27 label1: 28 { 29 // 來源 view 的尺寸要映射到目標 view 上返回其尺寸 30 CGRect rect = [sourceView convertRect:sourceView.bounds toView:destinationView]; 31 NSLog(@"%@", NSStringFromCGRect(rect)); 32 } 33 34 label2: 35 { 36 CGRect rect = [destinationView convertRect:sourceView.bounds fromView:sourceView]; 37 NSLog(@"%@", NSStringFromCGRect(rect)); 38 } 39 40 label3: 41 { 42 CGRect rect = [sourceView.superview convertRect:sourceView.frame toView:destinationView]; 43 NSLog(@"%@", NSStringFromCGRect(rect)); 44 } 45 46 label4:// 錯誤轉換 47 { 48 // 異常翻倍 目標x+|來源x-目標x|*2 目標y+|來源y-目標y|*2 49 CGRect rect = [destinationView convertRect:sourceView.frame fromView:sourceView]; 50 NSLog(@"%@", NSStringFromCGRect(rect)); 51 // 兩種正確方法 52 // label5: [destinationView convertRect:sourceView.frame fromView:sourceView.superview]; 53 // label2: [destinationView convertRect:sourceView.bounds fromView:sourceView]; 54 // 對convertRect 調用者理解有誤,應該是需要轉換控件的參考系視圖,而不是自身。 55 } 56 57 label5: 58 { 59 CGRect rect = [destinationView convertRect:sourceView.frame fromView:sourceView.superview]; 60 NSLog(@"%@", NSStringFromCGRect(rect)); 61 } 62 63 /* 64 - (CGPoint)convertPoint:(CGPoint)point toView:(nullable UIView *)view; 65 - (CGPoint)convertPoint:(CGPoint)point fromView:(nullable UIView *)view; 66 - (CGRect)convertRect:(CGRect)rect toView:(nullable UIView *)view; 67 - (CGRect)convertRect:(CGRect)rect fromView:(nullable UIView *)view; 68 總結: 69 1. from 和 to 是相對應的一組功能, 熟練一種即可,本人習慣使用 to。 70 2. 作用:計算[源]上的[被操作的對象]相對於[目標]的frame。from: 源 to: 目標 那麽相對應的就是調用者是 from 或者 to 對應的 71 3. 調用者應該是需要轉換控件的參考系視圖,而不是自身。 72 4. point 和 rect 的 差別也不多。 73 */

Demo鏈接: https://pan.baidu.com/s/1skEi0FV 密碼: 8swh

iOS convertRect:view.frame toView: x 異常翻倍?