UIView 坐标转换

例子1

Controller的view中有一个tableView,tableView的cell上有一个button,现在需要将button的frame转为在Controller的view中的frame,怎么实现呢?

CGRect rect = [self.view convertRect:_button.frame fromView:_button.superview];
CGRect rect = [_button.superview convertRect:_button.frame toView:self.view];

注意1.

button的frame是相对于其superview来确定的,frame确定了button在其superview的位置和大小

注意2.

现在转换后,我们肉眼观察到的,所有屏幕上的控件的布局并不会改变,但是此时以上两个方法返回的frame代表着,button在self.view上的大小和位置

注意3.

这里应该使用的是_button.frame而不能是_button.bounds

注意4.

这里2个方法是可逆的,2个方法的区别就是消息的接收者和view参数颠倒

注意5.

这里_button虽然是在tableView上的,但是不能写toView的消息接受者不能是tableView,因为_button的superview并不是tableView

注意6.

注意理解消息的接受者,即第一行代码的self.view和第二行代码的_button.superview

一般来说,toView方法中,消息的接受者为被转换的frame所在的控件的superview;fromView方法中,消息的接受者为即将转到的目标view

例子2

现在需要将一个触摸事件的点screenPoint(触摸事件的点的坐标系是相对于当前的屏幕——UIWindow),转化为屏幕里某个tableView上的点。即我想知道,我现在触摸的屏幕位置,是在这个tableView的什么位置上

CGPoint tablePT = [_tableView convertPoint:screenPoint fromView:nil];

注意1.

当参数view为nil的时候,系统会自动帮你转换为当前窗口的基本坐标系(即view参数为整个屏幕,原点为(0,0),宽高是屏幕的宽高)

注意2.

当view不为nil的时候,消息的接受者和参数view都必须是在同一个UIWindow对象里

If view is nil, this method instead converts to window base coordinates. Otherwise, both view and the receiver must belong to the same UIWindow object.

例子3

responseDragbackAtScreenPoint方法用于判断是否响应横滑返回消息,screenPoint是触摸事件的点

现在tableView上的cell中有一个横滑列表(UIScrollView),现在需要判断触摸点是否在UIScrollView的区域上,再根据其他条件判断是否需要横滑返回

- (BOOL)responseDragbackAtScreenPoint:(CGPoint)screenPoint
{
    //将当前触摸点转化为tableView上的点
    CGPoint tablePT = [tableView convertPoint:screenPoint fromView:nil];
    //根据tableView上的点定位到当前点的IndexPath
    NSIndexPath *pathIndex = [tableView indexPathForRowAtPoint:tablePT];
    //根据IndexPath找到当前触摸位置的cell
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:pathIndex];

    //遍历该cell上的所有subView
    NSArray *subViews = [cell.contentView subviews];
    for (UIView *itemView in subViews)
    {
        //找打当前cell上的UIScrollView,目前业务上只有1个
        if ([itemView isKindOfClass:[UIScrollView class]])
        {
            UIScrollView *itemScrollView = (UIScrollView *)itemView;
            //将当前的scrollView的frame转为相对于整个屏幕上的frame
            CGRect rc = [itemScrollView.superview convertRect:itemScrollView.frame toView:nil];
            //因为screenPoint和rc是同一个坐标系下的,所以可以用来判断screenPoint是否在rc的区域内
            //1.当scrollView的cell超过屏幕的时候 2.当触摸点在scrollView的区域上的时候 3.当不是以下情况:scrollView还未被滑动的时候手指在上面向右滑 1.2.3都满足的情况下才不响应横滑返回
            if (itemScrollView.contentSize.width > itemScrollView.width &&
                CGRectContainsPoint(rc, screenPoint) &&
                !(itemScrollView.contentOffset.x == -itemScrollView.contentInset.left))
                return NO;
        }
    }
    return YES;
}

汇总

iOS中,常用的坐标转换和frame转换如下:

// 将像素point由point所在视图转换到目标视图view中,返回在目标视图view中的像素值
- (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view;

// 将像素point从view中转换到当前视图中,返回在当前视图中的像素值
- (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view;

// 将rect由rect所在视图转换到目标视图view中,返回在目标视图view中的rect
- (CGRect)convertRect:(CGRect)rect toView:(UIView *)view;

// 将rect从view中转换到当前视图中,返回在当前视图中的rect
- (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view;
时间: 2024-08-27 18:07:05

UIView 坐标转换的相关文章

UIView中的坐标转换

// 将像素point由point所在视图转换到目标视图view中,返回在目标视图view中的像素值 - (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view; // 将像素point从view中转换到当前视图中,返回在当前视图中的像素值 - (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view; // 将rect由rect所在视图转换到目标视图view中,返回在目

IOS-- UIView中的坐标转换

// 将像素point由point所在视图转换到目标视图view中,返回在目标视图view中的像素值 - (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view; // 将像素point从view中转换到当前视图中,返回在当前视图中的像素值 - (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view; // 将rect由rect所在视图转换到目标视图view中,返回在目

iOS开发笔记--UIView中的坐标转换

[objc] view plaincopy // 将像素point由point所在视图转换到目标视图view中,返回在目标视图view中的像素值 - (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view; // 将像素point从view中转换到当前视图中,返回在当前视图中的像素值 - (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view; // 将rect由rec

iOS开发笔记--UIView中的坐标转换(convertRect)

// 将像素point由point所在视图转换到目标视图view中,返回在目标视图view中的像素值 - (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view; // 将像素point从view中转换到当前视图中,返回在当前视图中的像素值 - (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view; // 将rect由rect所在视图转换到目标视图view中,返回在目

模拟UIView的hitTest:方法和pointInside:方法的实现

对于UIView 的两个方法的讲解: - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 网上对这两个方法的讲解很多,但是大部分是纯文字的描述,我不再赘述,需要可以自己百度"UIView hitTest"等等. 我现在根据我的理解,把这两个方法的源码实现模拟出来. 注意:这里只是模拟,是为了让

iOS UIView非常用方法及属性详解

在调用视图的 Quartz  调用都可以正确地在视图中描画. 视图对象通过 bounds .和 center  属 性声明来跟踪自己的大小和位置.frame 属性包含一个矩形,即边框矩形,用于指定视图相对于其父视图坐标系统的位置和大小.bounds 属性也包含一个矩形,即边界矩形,负责定义视图相对于本地坐标系统的位置和大小.虽然边界矩形的原点通常被设置为(0, 0),但这并不是必须的.center 属性包含边框矩形的中心点. 当您在代码中通过 initWithFrame :方法创建一个视图对象时

UIView如何管理它的子视图

UIView提供了很多建立和管理视图的方法. 1.添加视图 insertSubview:atIndex:   //放在子视图数组的具体索引位置 insertSubview:aboveSubview:   //某个子视图前面 insertSubview:aboveSubview:   //某个子视图前面 2.重新排序和删除子视图 [parentView exchangeSubviewAtIndex:i withSubviewAtIndex:j]//交换两个视图的位置 bringSubviewToF

【转】 UIView如何管理它的子视图

原文:http://my.oschina.net/u/1984662/blog/293690 目录[-] Core Animation基础 改变视图的层 动画支持 视图坐标系统 边框.边界.和中心的关系 坐标系统变换 内容模式与比例缩放 自动尺寸调整行为 创建和管理视图层次 创建一个视图对象 添加和移除子视图 视图层次中的坐标转换 标识视图 在运行时修改视图 实现视图动画 配置动画的参数 配置动画的委托 响应布局的变化 重画视图的内容 隐藏视图 创建一个定制视图 初始化您的定制视图 描画您的视图

UIView Programming Guide学习笔记

View Creating and Configuring View Objects Creating View Objects Using Interface Builder 用Interface Builder就是大家熟知的用StoryBoard进行页面的创建,这里就不多讲了.主要是用StoryBoard进行UI的实现还是用Programatic的方法好呢,需要以后的继续研究. Creating View Objects Programmatically 默认的View的初始化函数是init