文档章节

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

Youth_关旋
 Youth_关旋
发布于 2016/11/14 14:50
字数 326
阅读 87
收藏 0
点赞 0
评论 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 ⋅ 0

IOS视图View 的frame与bounds的区别

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

Corwien ⋅ 2016/04/12 ⋅ 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 ⋅ 0

.NET中Winform窗体应用程序的几个关于坐标的知识点

本文是我对一些Winform下常用的坐标知识点做一个总结。 一、关于坐标 在计算机中,左上角是原点,从左上角向右为X轴的正方向,从左上角向下为Y轴的正方向。坐标在.NET中通过Point结构表示,该...

北风其凉 ⋅ 2015/10/15 ⋅ 0

UIView管理方法 (API)

UIView管理方法 //加一个视图到一个视图里面 addSubview: //将一个视图移到前面 bringSubviewToFront: //将一个视图推送到背后 sendSubviewToBack: //把视图移除 removeFromSuperview //插入...

xiaofer2008 ⋅ 2013/02/22 ⋅ 0

自定义窗口漂浮按钮,可随便拖动

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

远航Yang ⋅ 2017/10/25 ⋅ 0

swift-视图跟随手指移动

要实现让一个view跟随手指在屏幕上移动的思路如下: 1.记录手指移动时的相对位移量 2.根据相对位移量改变view的frame。 实现思路清晰后,实现就简单了。 一、实现方式一 重写 UIResponder 的...

zh_iOS ⋅ 2016/12/19 ⋅ 0

IOS开发之UIView

#import "AppDelegate.h" @interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )l......

鹿微微鹿 ⋅ 2016/04/05 ⋅ 0

CALayer与UIView的关系

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

Megan_zhou ⋅ 2014/04/30 ⋅ 0

Android PopupWindow控制位置

最近比较偷懒哈,已经有一段时间没有更新分享了,一个原因也是最近需要接触前端的一些知识,另外也是项目比较忙,周末事情也是比较多和杂,也就没有多少精力来更新分享了。言归正传,今天我们...

juexingzhe ⋅ 2017/10/29 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

VS2015配置并运行汇编(一步一步照图做)【vs2017的链接在最后】

x64: TITLE Add and Subtract (AddSub.asm) ; This program adds and subtracts 32-bit integers. ; Last update: 2/1/02 ;.MODEL flat,stdcall x64 not su......

simpower ⋅ 昨天 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 昨天 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 昨天 ⋅ 0

你真的明白RPC 吗?一起来探究 RPC 的实质

你真的明白RPC 吗?一起来探究 RPC 的实质 不论你是科班出身还是半路转行,这么优秀的你一定上过小学语文,那么对扩句和缩句你一定不陌生。缩句就是去除各种修饰提炼出一句话的核心,而不失基...

AI9o後 ⋅ 昨天 ⋅ 0

z-index设置失效?

今天碰到了一个问题,就是在给li设置提示框的时候,有用到遮罩效果,本来想把对应的出现在最顶层,可是不管将li设置的z-index值设为多大,li都没有出现在遮罩层之上。 我在网上查了z-index设...

IrisHunag ⋅ 昨天 ⋅ 0

CyclicBarrier、CountDownLatch以及Semaphore使用及其原理分析

CyclicBarrier、CountDownLatch以及Semaphore是Java并发包中几个常用的并发组件,这几个组件特点是功能相识很容易混淆。首先我们分别介绍这几个组件的功能然后再通过实例分析和源码分析其中设...

申文波 ⋅ 昨天 ⋅ 0

Java对象的序列化与反序列化

Java对象的序列化与反序列化

Cobbage ⋅ 昨天 ⋅ 0

Sqoop

1.Sqoop: 《=》 SQL to Hadoop 背景 1)场景:数据在RDBMS中,我们如何使用Hive或者Hadoop来进行数据分析呢? 1) RDBMS ==> Hadoop(广义) 2) Hadoop ==> RDBMS 2)原来可以通过MapReduce I...

GordonNemo ⋅ 昨天 ⋅ 0

全量构建和增量构建的区别

1.全量构建每次更新时都需要更新整个数据集,增量构建只对需要更新的时间范围进行更新,所以计算量会较小。 2.全量构建查询时不需要合并不同Segment,增量构建查询时需要合并不同Segment的结...

无精疯 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部