在iOS开发中,我们会经常遇到一个问题,例如,点击一个按钮,弹出一个遮罩层,上面显示一个弹框,弹框显示的位置在按钮附近。如果这个按钮的位置相对于屏幕边缘的距离是固定的,那就容易了,可以直接写死位置。可是,如果按钮是在UITableView的cell上呢?随着UITableView的滚动,按钮可能在顶部,也可能在底部,还可能在中间,左侧、右侧都有可能,那么,这个时候,怎么去计算按钮所在的位置呢?如果按钮所在的UITabelView是在另外一个UIScrollView的一个cell上呢?如果外面再有一个滚动层呢?这种布局确实很复杂。

最近公司的项目中有一个需求,所使用的层级就是一个UITableView中嵌套了一个UITableView和一个UICollectionView,而且还有一个点击按钮,效果就类似于头条资讯列表的小叉号,点击在按钮旁边弹出一个视图,对资讯进行屏蔽等操作。我在点击按钮的时候弹出一个顶级的遮罩层,在遮罩上面增加了一个操作的区域,但是,操作区域的位置需要根据按钮的位置进行确定,所以,花了点时间写了个方法,用来找到按钮在屏幕上的位置,相对于屏幕来说的;

其实代码并不多,只需要写一个UIView的扩展方法就行

extension UIView {
func zhmfPositionInScreen() -> CGPoint {
/// 先判断是否有父视图,如果没有父视图,直接返回视图的位置就行
if let superView = self.superview {
/**
判断父视图是否是UIScrollView或者继承自UIScrollView 先使用视图在屏幕上的位置使用视图的位置与父视图的位置X与Y分别相加 如果父视图不是UIScrollView并且不继承自UIScrollView,则直接返回结果 如果父视图是UIScrollView或者继承自UIScrollView 还需要分别减去UIScrollView的scrollViewOffset.x和scrollViewOffset.y,然后返回结果
*/
if let scrollView = superView as? UIScrollView {
let position = CGPoint.init(x: self.frame.origin.x, y: self.frame.origin.y)
let superPosition = superView.zhmfPositionInScreen()
let scrollViewOffset = scrollView.contentOffset
return CGPoint.init(x: superPosition.x + position.x - scrollViewOffset.x , y: superPosition.y + position.y - scrollViewOffset.y)
} else {
let superPosition = superView.zhmfPositionInScreen()
let position = self.frame.origin
return CGPoint.init(x: superPosition.x + position.x, y: superPosition.y + position.y)
}
} else {
return self.frame.origin
}
}
}

获取视图在屏幕上位置的扩展方法已经写好了,只需要在使用的使用调一下就好了

button.zhmfPositionInScreen()

虽然代码量不大,但当时也花了一点时间想逻辑,没有去百度等搜索,能自己写的,还是自己花时间想吧,不然,脑子懒了,就真的只能是码农了。

新增:

突然发现,原来官方就给我们写好了转换的方法

guard let window = UIApplication.shared.keyWindow else {
return
}
topView = UIView.init(frame: .init(x: 100, y: 100, width: 100, height: 100))
let rect = topView.convert(topView.bounds, to: window)

这个方法没有测试过多个scrollView嵌套是否有效,喜欢折腾的同学可以自己去尝试下。

iOS开发,专注swift,如果想交流,随时欢迎,期待一起进步!!!

最新文章

  1. React官网学习笔记
  2. MATLAB的GUI
  3. JS控制TABLE表格在任意一行下面添加一行(有待完善)
  4. 【Delphi7】 解决“程序第一次可以正常编译,但再次编译的时候会报错,必须重新打开Delphi”的问题
  5. PHP的学习--可变变量
  6. org.hibernate.NonUniqueObjectException: a different object with the same identifier value was alread---------程序报错
  7. 作业4-两人编程<词频统计>
  8. CentOS 6.5下搭建LAMP环境详细步骤
  9. Struts2_ValueStack,OGNL详解
  10. 设计模式初学者笔记:Factory Method模式
  11. Java学习--final与static
  12. java学习笔记 --- java基础语法
  13. Java并发编程-阻塞队列
  14. Windows 产品激活状态、密钥等信息查看
  15. Python——阶段总结(一)
  16. Ajax验证用户名是否被注册
  17. 解决Mysql错误:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)
  18. java中MD5加密
  19. SQL Server中获取指定时间段内的所有月份
  20. 代码: 两列图片瀑布流(一次后台取数据,图片懒加载。下拉后分批显示图片。图片高度未知,当图片onload后才显示容器)

热门文章

  1. css3弹性盒模型flex快速入门与上手1
  2. 不错的JQuery屏幕居中提示信息封装,使用方便,可集成到项目
  3. 架构师必备软件:安装Dubbo注册中心(Zookeeper-3.4.6)
  4. JavaScript正则表达式实例汇总
  5. Go 终极指南:编写一个 Go 工具
  6. 容器与Docker简介(四)Docker容器,镜像与 Registries——微软微服务电子书翻译系列
  7. 学习Identity Server 4的预备知识
  8. ASP.NET没有魔法——Identity与Owin
  9. 循环渐进linux笔记——linux系统基本机构
  10. 在mac OS10.10下安装 cocoapods遇到的一些问题