iOS convertRect:view.frame toView: x 异常翻倍?
Posted 画梦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS convertRect:view.frame toView: x 异常翻倍?相关的知识,希望对你有一定的参考价值。
项目中遇到过,故查资料自己写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 异常翻倍?的主要内容,如果未能解决你的问题,请参考以下文章