总是忘记的坐标转换,首先看具体的方法
- (CGPoint)convertPoint:(CGPoint)point toView:(nullable UIView *)view;
- (CGPoint)convertPoint:(CGPoint)point fromView:(nullable UIView *)view;
- (CGRect)convertRect:(CGRect)rect toView:(nullable UIView *)view;
- (CGRect)convertRect:(CGRect)rect fromView:(nullable UIView *)view;
-
演示用的Demo
33B83484C34BB13433DC1765140FAA49.png
具体的分析看下面代码:
//
// SFAqArtController.m
// SFHoverTableView
//
// Created by 随风流年 on 2019/8/12.
// Copyright © 2019 随风流年. All rights reserved.
//
#import "SFAqArtController.h"
@interface SFAqArtController ()
@end
@implementation SFAqArtController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
UIView *redView = [[UIView alloc]initWithFrame:CGRectMake(200, 200, 100, 100)];
redView.backgroundColor = [UIColor redColor];
[self.view addSubview:redView];
UIView *greenView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 50, 50)];
greenView.backgroundColor = [UIColor greenColor];
[self.view addSubview:greenView];
UIView *blueView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 40, 40)];
blueView.backgroundColor = [UIColor blueColor];
[redView addSubview:blueView];
CGRect rec = [self.view convertRect:blueView.frame fromView:redView];
NSLog(@"rec:%@",NSStringFromCGRect(rec));//rec:{{200, 200}, {40, 40}}
// redview中的blueview相对于self.view的位置 ✔️
CGRect rec1 = [self.view convertRect:redView.frame fromView:blueView];
NSLog(@"rec1:%@",NSStringFromCGRect(rec1));//rec1:{{400, 400}, {100, 100}} ✅
// 蓝色view中的定义一个相对于蓝色view的frame的view,这个view相对于self.view的位置
CGRect rect = [redView convertRect:greenView.frame toView:self.view];
NSLog(@"rect:%@",NSStringFromCGRect(rect));//rect:{{300, 300}, {50, 50}} ✅
/// 在redView中,定义一个相对于redView(100,100),大小为(50,50)的view,这个view相对于self.view的位置
/// 需要注意的是toview可以传nil
CGRect rect1 = [redView convertRect:greenView.frame toView:nil];
NSLog(@"rect1:%@",NSStringFromCGRect(rect1));//rect1:{{100, 100}, {50, 50}} ✅
/// 上面的代码的意思是:在redView中,定义一个目标区域,该区域相对于window的位置(nil代表的是self.view.window)
CGRect rect2 = [redView convertRect:greenView.frame toView:blueView];
NSLog(@"rect2:%@",NSStringFromCGRect(rect2));//rect2:{{100, 100}, {50, 50}}
//在redView中,定义一个相对于redview(100,100),大小为(50,50)的view,这个view相对于blueView的位置
CGRect rect3 = [redView convertRect:CGRectMake(80, 80, 80, 80) toView:blueView];
NSLog(@"rect3:%@",NSStringFromCGRect(rect3));//rect3:{{80, 80}, {80, 80}}
//在redView中,定义一个相对于redview(80,80),大小为(80,80)的view,这个view相对于blueView的位置
CGRect rect4 = [redView convertRect:CGRectMake(80, 80, 80, 80) toView:greenView];
NSLog(@"rect4:%@",NSStringFromCGRect(rect4));//rect4:{{180, 180}, {80, 80}}
//在redView中,定义一个相对于redview(80,80),大小为(80,80)的view,这个view相对于greenView的位置
CGRect rect5 = [redView convertRect:CGRectMake(20, 20, 80, 80) toView:greenView];
NSLog(@"rect5:%@",NSStringFromCGRect(rect5));//rect5:{{120, 120}, {80, 80}}
//在redView中,定义一个相对于redview(80,80),大小为(80,80)的view,这个view相对于greenView的位置
CGRect newRect = [redView convertRect:greenView.bounds toView:nil];
NSLog(@"newRect:%@",NSStringFromCGRect(newRect));//newRect:{{0, 0}, {50, 50}}
CGRect newRect0 = [redView convertRect:greenView.frame toView:nil];
NSLog(@"newRect0:%@",NSStringFromCGRect(newRect0));//newRect0:{{100, 100}, {50, 50}}
CGRect newRect1 = [redView convertRect:redView.bounds toView:nil];
NSLog(@"newRect1:%@",NSStringFromCGRect(newRect1));//newRect1:{{0, 0}, {100, 100}}
CGRect newRect2 = [redView convertRect:redView.frame toView:nil];
NSLog(@"newRect2:%@",NSStringFromCGRect(newRect2));//newRect2:{{200, 200}, {100, 100}}
}
@end
这里也可以看出bounds和frame的区别
2019-08-12 14:54:04.798060+0800 SFHoverTableView[10946:186139] rec:{{200, 200}, {40, 40}}
2019-08-12 14:54:04.798231+0800 SFHoverTableView[10946:186139] rec1:{{400, 400}, {100, 100}}
2019-08-12 14:54:04.798333+0800 SFHoverTableView[10946:186139] rect:{{300, 300}, {50, 50}}
2019-08-12 14:54:04.798420+0800 SFHoverTableView[10946:186139] rect1:{{100, 100}, {50, 50}}
2019-08-12 14:54:04.798508+0800 SFHoverTableView[10946:186139] rect2:{{100, 100}, {50, 50}}
2019-08-12 14:54:04.798594+0800 SFHoverTableView[10946:186139] rect3:{{80, 80}, {80, 80}}
2019-08-12 14:54:04.798678+0800 SFHoverTableView[10946:186139] rect4:{{180, 180}, {80, 80}}
2019-08-12 14:54:04.798758+0800 SFHoverTableView[10946:186139] rect5:{{120, 120}, {80, 80}}
2019-08-12 14:54:04.798832+0800 SFHoverTableView[10946:186139] newRect:{{0, 0}, {50, 50}}
2019-08-12 14:54:04.798913+0800 SFHoverTableView[10946:186139] newRect0:{{100, 100}, {50, 50}}
2019-08-12 14:54:04.799096+0800 SFHoverTableView[10946:186139] newRect1:{{0, 0}, {100, 100}}
2019-08-12 14:54:04.799377+0800 SFHoverTableView[10946:186139] newRect2:{{200, 200}, {100, 100}}
总结:
- toView就是从左往右开始读代码,也是从左往右理解意思
- fromView就是从右往左开始读代码,也是从右往左理解意思










网友评论