iOS開發中獲取視圖在屏幕上顯示的位置

来源:http://www.cnblogs.com/zhanbaocheng/archive/2017/11/18/7855937.html
-Advertisement-
Play Games

在iOS開發中,我們會經常遇到一個問題,例如,點擊一個按鈕,彈出一個遮罩層,上面顯示一個彈框,彈框顯示的位置在按鈕附近。如果這個按鈕的位置相對於屏幕邊緣的距離是固定的,那就容易了,可以直接寫死位置。可是,如果按鈕是在UITableView的cell上呢?隨著UITableView的滾動,按鈕可能在頂 ...


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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一個是前面提到的可以讀取函數內部的變數,另一個就是讓這些變數的值始終保持在記憶體中。 ...
  • 在閱讀一本HTML5游戲開發相關書籍時發現一個很好的例子,通過這個例子可以對面向對象的開發進行更深入的理解。這個對象要實現的是:將一個CSS sprite中的圖像繪製到canvas中。首先創建一個SpriteSheet對象,代碼如下: var SpriteSheet = new function() ...
  • 隨著互聯網的深入發展,前端開發工程師一躍成為市場上非常搶手的人才。很多同學,包括以前做UI的、Java的、或者對於IT完全零基礎的同學都想學習前端。下圖是網上流傳甚廣的一張前端學習思維導圖,很多初學者表示看到這些密密麻麻的知識點就已經暈了。確實,前端是一門涵蓋面很廣的學科。但是想學前端的你也不用慌張 ...
  • 前面的話 javascript里的關係又多又亂。作用域鏈是一種單向的鏈式關係,還算簡單清晰;this機制的調用關係,稍微有些複雜;而關於原型,則是prototype、proto和constructor的三角關係。本文先用一張圖開宗明義,然後詳細解釋原型的三角關係 圖示 概念 上圖中的複雜關係,實際上 ...
  • 一、變數 二、sass命名時橫杠和下劃線不區分 三、變數中可以套用變數 四、嵌套規則 五·、偽類和直接調用父級符號& 六、sass的導入 七、嵌套導入 八、關於註釋 九、預設變數 十、混合器的使用mixin 十一、混合器mixin傳參數 十二:繼承 十三:占位符 註意:占位符和繼承的區別:以上占位符 ...
  • 1、使用絕對定位垂直居中 絕對對位原理:元素在過度受限情況下,將margin設置為auto,瀏覽器會重算margin的值,過度受限指的是同時設置top/bottom與height或者left/right與width。 使用絕對定位要求元素必須設置明確高度。內容超過元素高度時需要設置overflow決 ...
  • #如何在main.js直接使用Vue.use()使用自己的自定義組件呢? 需要自己去定義一個test組件,在components下新建文件夾test,test下包含index.js和test.vue index.js內容如下: test.vue內容如下: 最後在main.js下導入: 在其他組件就可 ...
  • ToolBar比ActionBar更加可控,自由。因此,Google 逐漸使用ToolBar來代替ActionBar。 轉載請標明出處http://www.cnblogs.com/tangZH/p/7850572.html 使用ToolBar 1.要引入appCompat_v7支持 2.主題設置為N ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...