界面iOS动画iOS Developer

iOS坐标系的转换

2016-01-02  本文已影响4906人  船长_
test1.png

什么是坐标系的转换?

不同坐标系,控件的View的frame值是不同的,比如上图的红色View,以蓝色控件为父控件作为坐标系原点,那么它的frame的x = 50,y = 50;如果红色View以控制器的View为坐标系的原点,那么它的frame的x = 100 + 50,y = 100 + 50;
如果两个View进行比较,比如是否包含,是否交叉重叠,那么应该转换成同一坐标系,这样才可以直接比较;

1.同一坐标系View1和View2之间比较

// rect1是否包含rect2,必须是同一个坐标系,返回值是bool
   CGRectContainsRect(rect1, rect2)
// 是否有交叉,必须是同一个坐标系,返回值是bool
   CGRectIntersectsRect(rect1, rect2)
// 这个点是否在这个矩形框内,返回值是bool
   CGRectContainsPoint(rect1, point)

2.不同坐标系View1和View2之间比较

首先了解两个重要的方法:

view2坐标系 : 以view2的左上角为坐标原点
view1坐标系 : 以view1的左上角为坐标原点

// 显然这里rect不是View的frame,而是bound 
// 让rect这个矩形框, 从view2坐标系转换到view1坐标系, 得出一个新的矩形框newRect
// rect和view2的含义 : 用来确定矩形框原来在哪
CGRect newRect = [view1 convertRect:rect fromView:view2];

// 让rect这个矩形框, 从view1坐标系转换到view2坐标系, 得出一个新的矩形框newRect
// rect和view1的含义 :用来确定矩形框原来在哪
CGRect newRect = [view1 convertRect:rect toView:view2];

1.确定redView在window中的位置和尺寸

// 这里用`CGRect newRect = [view1 convertRect:rect toView:view2];;
`,这个方法演示

// 方法一:
CGRect newRect = [self.redView convertRect:self.redView.bounds toView:[UIApplication sharedApplication].keyWindow];

// 方法二:
CGRect newRect = [self.redView.superview convertRect:self.redView.frame toView:[UIApplication sharedApplication].keyWindow];

// 方法三:
// 在这里 [UIApplication sharedApplication].keyWindow == nil;
CGRect newRect = [self.redView convertRect:self.redView.bounds toView:nil];

2.确定blueView在window中的位置和尺寸

// 这里用`CGRect newRect2 = [view1 convertRect:rect fromView:view2];
`,这个方法演示

// 注意这里` [[UIApplication sharedApplication].keyWindow`不能写nil
CGRect newRect = [[UIApplication sharedApplication].keyWindow convertRect:self.blueView.bounds fromView:self.blueView];

3.判断两个rect是否有交叉重叠

NSLog(@"%zd", CGRectIntersectsRect(newRect, newRect2));

3.1判断newRect是否包含newRect2

NSLog(@"%zd", CGRectContainsRect(newRect, newRect2));

3.封装代码,判断两个View是否有重叠

- (BOOL)intersectWithView:(UIView *)view
{
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    CGRect selfRect = [self convertRect:self.bounds toView:window];
    CGRect viewRect = [view convertRect:view.bounds toView:window];
    return CGRectIntersectsRect(selfRect, viewRect);
}
上一篇下一篇

猜你喜欢

热点阅读