美文网首页
UIView中的坐标转换

UIView中的坐标转换

作者: Coder东 | 来源:发表于2019-08-12 15:01 被阅读0次

总是忘记的坐标转换,首先看具体的方法

- (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就是从右往左开始读代码,也是从右往左理解意思

相关文章

  • UIView中坐标转换

    LKPopover运用到坐标转换可以去看看。eg:现在有一个常见的需求怎么获得cell中button在tableV...

  • UIView中的坐标转换

    UIView中的坐标转换 将像素point由point所在视图转换到目标视图view中,返回在目标视图view中的...

  • UIView中的坐标转换

    // 将像素point由point所在视图转换到目标视图view中,返回在目标视图view中的像素值- (CGPo...

  • UIView中的坐标转换

    CGRectContainsRect(<#CGRect rect1#>,<#CGRect rect2#>)//表示...

  • UIView中的坐标转换

    - (CGPoint)convertPoint:(CGPoint)point toView:(nullable U...

  • UIView中的坐标转换

    大部分内容转自http://greenchiu.github.io/blog/2014/09/01/memo-th...

  • UIView中的坐标转换

    总是忘记的坐标转换,首先看具体的方法 演示用的Demo33B83484C34BB13433DC1765140FAA...

  • iOS UIView中坐标转换

    在开发中我们经常会需要判断两个控件是否包含重叠,此时如果控件A和B的坐标原点如果不确定的话,那么肯定会导致比较不正...

  • UIView坐标转换

    我理解的坐标转换就是 同一个点 放在不同view上的坐标。举个例子sender 是 加在 self.view 上的...

  • 关于UIView中的坐标转换

    在开发中我们经常会需要判断两个控件是否包含重叠,此时如果控件A和B的坐标原点如果不确定的话,那么肯定会导致比较不正...

网友评论

      本文标题:UIView中的坐标转换

      本文链接:https://www.haomeiwen.com/subject/hddujctx.html