欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS开发之如何获取视图在屏幕中显示的位置

程序员文章站 2023-12-17 20:47:40
前言 相信大家在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()

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

ios 获取控件相对屏幕的位置

需要获取的对象为view1,则该视图相对屏幕的位置可使用下面方法实现:

uiwindow * window=[[[uiapplication sharedapplication] delegate] window];
 cgrect rect=[view1 convertrect: view1.bounds toview:window];

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

上一篇:

下一篇: