iOS開發中擷取視圖在螢幕上顯示的位置

來源:互聯網
上載者:User

標籤:一起   根據   底部   content   結果   osi   問題   遮罩   func   

在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開發,專註swift,如果想交流,隨時歡迎,期待一起進步!!!

iOS開發中擷取視圖在螢幕上顯示的位置

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.