iOS开发中获取视图在屏幕上显示的位置
在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,如果想交流,随时欢迎,期待一起进步!!!
iOS开发中获取视图在屏幕上显示的位置的更多相关文章
- iOS开发中获取WiFi相关信息
iOS 开发中难免会遇到很多与网络方面的判断,这里做个汇总,大多可能是与WiFi相关的. 1.Ping域名.Ping某IP 有 时候可能会遇到ping 某个域名或者ip通不通,再做下一步操作.这里的p ...
- iOS开发中获取文本的宽高的方式
/** 计算单行文字的size @parms 文本 @parms 字体 @return 字体的CGSize */ + (CGSize)sizeWithText:(NSString *)text ...
- IOS开发中获取当前WIFI的名字
ifs = [self fetchSSIDInfo]; ssid = [ifs objectForKey:@"SSID"]; self.sSIDTxt.textFi ...
- ios开发中加载的image无法显示
昨天遇到一个较奇葩的问题,imageName加载的图片显示不出来,网上查了好多资料还是没找到解决的方法: 之前图片是放在项目中SupportingFiles文件下的,怎么加载都能显示图片,于是将图片拿 ...
- IOS开发之表视图(UITableView)
IOS开发之表视图(UITableView)的基本介绍(一) (一):UITableView的基本概念 1.在IOS开发中,表视图的应用十分广泛和普及.因此掌握表视图的用法显得非常重要.一般情况下对于 ...
- iOS开发之获取沙盒路径
iOS开发之沙盒机制(SandBox)具体解说了沙盒的一些机制.在开发中,我们须要对沙盒进行操作.所以我们须要获取到沙盒路径. 沙盒里的目录包含Documents.Library.tmp.这三个目录的 ...
- IOS开发中UITableView(表视图)的滚动优化及自定义Cell
IOS开发中UITableView(表视图)的滚动优化及自定义Cell IOS 开发中UITableView是非常常用的一个控件,我们平时在手机上看到的联系人列表,微信好友列表等都是通过UITable ...
- iOS开发中视图控制器ViewControllers之间的数据传递
iOS开发中视图控制器ViewControllers之间的数据传递 这里我们用一个demo来说明ios是如何在视图控制器之间传递重要的参数的.本文先从手写UI来讨论,在下一篇文章中讨论在storybo ...
- iOS开发中图片方向的获取与更改
iOS开发中 再用到照片的时候 或多或少遇到过这样的问题 就是我想用的照片有横着拍的有竖着排的 所以导致我选取图片后的效果也横七竖八的 显示效果不好 比如: 图中红圈选中的图片选取的是横着拍 ...
随机推荐
- 通过npm写一个cli命令行工具
前言 如果你想写一个npm插件,如果你想通过命令行来简化自己的操作,如果你也是个懒惰的人,那么这篇文章值得一看. po主的上一篇文章介绍了定制自己的模版,但这样po主还是不满足啊,项目中我们频繁的需要 ...
- jquery系列教程4-事件操作全解
点击打开: jquery系列教程1-选择器全解 jquery系列教程2-style样式操作全解 jquery系列教程3-DOM操作全解 jquery系列教程4-事件操作全解 jquery系列教程5-动 ...
- Python和SQL Server 2017的强大功能
Python和SQL Server 2017的强大功能 摘要: 源:https://www.red-gate.com/simple-talk/sql/sql-development/power-pyt ...
- NSOperation与GCD的如何选择?
iOS开发的多线程实现方式,大概包括C的原始方式.NSThread方式.GCD.NSOperation的方式. 其中用的最多的应该是GCD和NSOperation的方式,很多第三方库都是使用了这两种方 ...
- Xamarin.Forms 开发IOS、Android、UWP应用
C#语言特点,简单.快速.高效.本次我们通过C#以及Xaml来做移动开发. 1.开发工具visual studio 2015或visual studio 2017.当然visual studio 20 ...
- 2D特效和3D特效
2D居中效果 div{ width: height: backgroundcolor: position:absolute; left:50%; top:50%; transform:translat ...
- vs2012建一个空解决方案添加以前老版本的Web项目调试弹出window安全
解决方法:NTLM身份验证去掉就行.
- 修改Oracle【12C】字符集
select userenv('language') from dual; //查看系统字符集编码 select * from nls_database_parameters where parame ...
- 微信小程序---wx.request(OBJECT)
详情 :https://mp.weixin.qq.com/debug/wxadoc/dev/api/network-request.html#wxrequestobject 1: 首先要配置你的域名 ...
- LeetCode 346. Moving Average from Data Stream (数据流动中的移动平均值)$
Given a stream of integers and a window size, calculate the moving average of all integers in the sl ...