iOS開發(fā)之如何獲取視圖在屏幕中顯示的位置
前言
相信大家在iOS開發(fā)中經(jīng)常會(huì)遇到一個(gè)問題,例如,點(diǎn)擊一個(gè)按鈕,彈出一個(gè)遮罩層,上面顯示一個(gè)彈框,彈框顯示的位置在按鈕附近。如果這個(gè)按鈕的位置相對(duì)于屏幕邊緣的距離是固定的,那就容易了,可以直接寫死位置。可是,如果按鈕是在UITableView的cell上呢?隨著UITableView的滾動(dòng),按鈕可能在頂部,也可能在底部,還可能在中間,左側(cè)、右側(cè)都有可能,那么,這個(gè)時(shí)候,怎么去計(jì)算按鈕所在的位置呢?如果按鈕所在的UITabelView是在另外一個(gè)UIScrollView的一個(gè)cell上呢?如果外面再有一個(gè)滾動(dòng)層呢?這種布局確實(shí)很復(fù)雜。
最近公司的項(xiàng)目中有一個(gè)需求,所使用的層級(jí)就是一個(gè)UITableView中嵌套了一個(gè)UITableView和一個(gè)UICollectionView,而且還有一個(gè)點(diǎn)擊按鈕,效果就類似于頭條資訊列表的小叉號(hào),點(diǎn)擊在按鈕旁邊彈出一個(gè)視圖,對(duì)資訊進(jìn)行屏蔽等操作。我在點(diǎn)擊按鈕的時(shí)候彈出一個(gè)頂級(jí)的遮罩層,在遮罩上面增加了一個(gè)操作的區(qū)域,但是,操作區(qū)域的位置需要根據(jù)按鈕的位置進(jìn)行確定,所以,花了點(diǎn)時(shí)間寫了個(gè)方法,用來找到按鈕在屏幕上的位置,相對(duì)于屏幕來說的;
方法如下:
其實(shí)代碼并不多,只需要寫一個(gè)UIView的擴(kuò)展方法就行
extension UIView {
func zhmfPositionInScreen() -> CGPoint {
/// 先判斷是否有父視圖,如果沒有父視圖,直接返回視圖的位置就行
if let superView = self.superview {
/**
判斷父視圖是否是UIScrollView或者繼承自UIScrollView
先使用視圖在屏幕上的位置使用視圖的位置與父視圖的位置X與Y分別相加
如果父視圖不是UIScrollView并且不繼承自UIScrollView,則直接返回結(jié)果
如果父視圖是UIScrollView或者繼承自UIScrollView
還需要分別減去UIScrollView的scrollViewOffset.x和scrollViewOffset.y,然后返回結(jié)果
*/
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
}
}
}
獲取視圖在屏幕上位置的擴(kuò)展方法已經(jīng)寫好了,只需要在使用的使用調(diào)一下就好了
button.zhmfPositionInScreen()
雖然代碼量不大,但當(dāng)時(shí)也花了一點(diǎn)時(shí)間想邏輯,沒有去百度等搜索,能自己寫的,還是自己花時(shí)間想吧,不然,腦子懶了,就真的只能是碼農(nóng)了。
ios 獲取控件相對(duì)屏幕的位置
需要獲取的對(duì)象為view1,則該視圖相對(duì)屏幕的位置可使用下面方法實(shí)現(xiàn):
UIWindow * window=[[[UIApplication sharedApplication] delegate] window]; CGRect rect=[view1 convertRect: view1.bounds toView:window];
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
總結(jié)iOS App開發(fā)中控制屏幕旋轉(zhuǎn)的幾種方式
這篇文章主要介紹了iOS app開發(fā)中控制屏幕旋轉(zhuǎn)的方法總結(jié),分為自動(dòng)旋轉(zhuǎn)和手動(dòng)旋轉(zhuǎn)以及強(qiáng)制旋轉(zhuǎn)三種情況,代碼為Objective-C語言,需要的朋友可以參考下2016-02-02
IOS Xcode調(diào)試常用命令和斷點(diǎn)整理
這篇文章主要介紹了IOS Xcode調(diào)試常用命令和斷點(diǎn)整理的相關(guān)資料,這里對(duì)IOS Xcode調(diào)試常用命令進(jìn)行了總結(jié),需要的朋友可以參考下2016-12-12
iOS關(guān)于多張圖片上傳、地址返回順序問題及解決方案
這篇文章主要介紹了iOS關(guān)于多張圖片上傳、地址返回順序問題,文章給大家?guī)砹巳N解決方案,通過實(shí)例文字說明相結(jié)合的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2018-07-07
IOS 頭文件導(dǎo)入-@class注意事項(xiàng)總結(jié)
這篇文章主要介紹了IOS 頭文件導(dǎo)入-@class注意事項(xiàng)總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-05-05
iOS三級(jí)聯(lián)動(dòng)選擇器的實(shí)現(xiàn)代碼示例
本篇文章主要介紹了iOS三級(jí)聯(lián)動(dòng)選擇器的實(shí)現(xiàn)代碼示例,這里整理了詳細(xì)的代碼,有需要的小伙伴可以參考下2017-09-09
iOS簡(jiǎn)單抽屜效果的實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了iOS簡(jiǎn)單抽屜效果的實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08

