文档章节

计算任意一个UIView相对屏幕的坐标 

Youth_关旋
 Youth_关旋
发布于 2016/11/14 14:50
字数 326
阅读 96
收藏 0

 

在很多时候,我们需要去计算一个UIView相对屏幕的坐标,来实现一些UI效果。 
在这个UIView未被嵌套多层的时候,相对屏幕的坐标很好算,只需要精准的拿到每层superview变量去计算。 
但是很多情况下,我们的UIView可能嵌套了很多层(我在项目中遇到的相对Controller.view就有6层之多),并且被嵌套在UIScrollView或者UITableView中,这个时候不可能去拿到每一层嵌套的superview的变量去计算。 
基于这个需求,我写了一个通用的方法,可以很方便的拿到任意一个UIView相对屏幕的坐标。 
 

代码虽然很简单,但是还是蛮实用的。

 

  1. /** 
  2.  *  计算一个view相对于屏幕(去除顶部statusbar的20像素)的坐标 
  3.  *  iOS7下UIViewController.view是默认全屏的,要把这20像素考虑进去 
  4.  */  
  5. + (CGRect)relativeFrameForScreenWithView:(UIView *)v  
  6. {  
  7.     BOOL iOS7 = [[[UIDevice currentDevice] systemVersion] floatValue] >= 7;  
  8.     
  9.     CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height;  
  10.     if (!iOS7) {  
  11.         screenHeight -= 20;  
  12.     }  
  13.     UIView *view = v;  
  14.     CGFloat x = .0;  
  15.     CGFloat y = .0;  
  16.     while (view.frame.size.width != 320 || view.frame.size.height != screenHeight) {  
  17.         x += view.frame.origin.x;  
  18.         y += view.frame.origin.y;  
  19.         view = view.superview;  
  20.         if ([view isKindOfClass:[UIScrollView class]]) {  
  21.             x -= ((UIScrollView *) view).contentOffset.x;  
  22.             y -= ((UIScrollView *) view).contentOffset.y;  
  23.         }  
  24.     }  
  25.     return CGRectMake(x, y, v.frame.size.width, v.frame.size.height);  
  26. }  

获取view相对于屏幕的坐标。有方法的:

 

  1. CGRect frame = [view convertRect:view.bounds toView:nil];  

本文转载自:http://blog.csdn.net/heng615975867/article/details/39698537

共有 人打赏支持
Youth_关旋
粉丝 2
博文 70
码字总数 23376
作品 0
枣庄
私信 提问
iOS核心动画笔记2-寄宿图

寄宿图 1. contents属性 CAlayer有一个属性, 这个属性被定义成id类型, 不管给它赋值任意类型都可以编译通过, 但是, 只有赋值类型才能正常展示出来一个图片, 其他类型得到的图层将是空白的. 之...

hell03W
2016/07/30
37
0
scrollview的属性解释和分页用法

转自:http://blog.sina.com.cn/s/blog8764c3140100wtoc.html 1. @property(nonatomic) BOOL bounces //当滚动到内容边缘是否发生反弹,default is YES. 2. @property(nonatomic) BOOL alwa......

Daniel_s
2015/12/25
81
0
IOS视图View 的frame与bounds的区别

在学习IOS一段时间后,突然对view 的frame和bounds这两个属性搞迷糊了,不知两者的区别了,只记得以前有学过,今天重新再复习一下,看来好记性不如烂笔头,做个笔记,帮助自己记忆和快速复习...

Corwien
2016/04/12
52
0
自定义窗口漂浮按钮,可随便拖动

按钮放置窗口上,用户可随便拖动按钮到任意的位置,当位置超出窗口的时候,按钮会自动移动到视图边缘,按钮移动到视图中间的时候,按钮也会往最近的边缘移动,不会产生遮挡其他视图。 1,自定...

远航Yang
2017/10/25
0
0
CALayer与UIView的关系

UIView是iOS系统中界面元素的基础,所有的界面元素都是继承自它。它本身完全是由CoreAnimation来实现的。它真正的绘图部分,是由一个CALayer类来管理。UIView本身更像是一个CALayer的管理器,...

Megan_zhou
2014/04/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

错误: 找不到或无法加载主类

在IDEA的使用过程中,经常断掉服务或者重启服务,最近断掉服务重启时突然遇到了一个启动报错: 错误:找不到或无法加载主类 猜测:1,未能成功编译; 尝试:菜单---》Build---》Rebuild Pro...

安小乐
18分钟前
1
0
vue路由传参,刷新页面,引发的bug

最近遇到一个bug 通过vue路由跳转到页面, 然后接参控制(v-if ),成功显示 而刷新页面,显示失败。 苦苦地找了半天原因,打印参数发现正确,再打印下类型......,路由跳过来会保持传参时的...

hanbb
19分钟前
0
0
【58沈剑 架构师之路】InnoDB,select为啥会阻塞insert?

MySQL的InnoDB的细粒度行锁,是它最吸引人的特性之一。 但是,如《InnoDB,5项最佳实践》所述,如果查询没有命中索引,也将退化为表锁。 InnoDB的细粒度锁,是实现在索引记录上的。 一,Inn...

张锦飞
22分钟前
0
0
冒泡,选择和插入排序比较

/** * 冒泡排序,两层嵌套循环,内层局部比较后,找出最大或者最小数据并交换数据,使其局部有序,外层用于比较剩余元素,相较于选择排序,选择排序相当于是冒泡的一个优化版本(减少了交换...

strict_nerd
23分钟前
0
0
html内联(行内)元素、块级(块状)元素和行内块元素分类

HTML可以将元素分类方式分为内联(行内)元素、块级(块状)元素和行内块元素三种。 注:HTML是标签语言,那么既然是标签,就可以自己定义一些自己元素(如<wode>自定义的元素</wode>等),自...

NB-One
29分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部