前言
乙個控制項從外在特徵來說,主要是封裝這幾點:
互動方式
顯示樣式
資料使用
對外在特徵的封裝,能讓我們在多種環境下達到 pm 對產品的要求,並且提到**復用率,使維護工作保持在乙個相對較小的範圍內;而乙個好的控制項除了有對外一致的體驗之外,還有其內在特徵:
靈活性
低耦合易拓展
易維護
通常特徵之間需要做一些取捨,比如靈活性與耦合度,有時候介面越多越能適應各種環境,但是介面越少對外產生的依賴就越少,維護起來也更容易。通常一些前期看起來還不錯的**,往往也會隨著時間加深慢慢「成長」,功能的增加也會帶來新的介面,很不自覺地就加深了耦合度,在開發中時不時地進行一些重構工作很有必要。總之,儘量減少介面的數量,但有足夠的定製空間,可以在一開始把介面全部隱藏起來,再根據實際需要慢慢放開。
自定義控制項在 ios 專案裡很常見,通常頁面之間入口很多,而且使用場景極有可能大不相同,比如乙個 uiview 既可以以**初始化,也可以以 xib 的形式初始化,而我們是需要保證這兩種操作都能產生同樣的行為。本文將會討論到以下幾點:
選擇正確的初始化方式
調整布局的時機
正確的處理 touches 方法
drawrectcalayer 與動畫
uicontrol 與 uibutton
更友好的支援 xib
不規則圖形和事件觸發範圍(事件鏈的簡單介紹以及處理)
合理使用 kvo
如果這些問題你一看就懂的話就不用繼續往下看了。
設計方針
選擇正確的初始化方式
uiview 的首要問題就是既能從**中初始化,也能從 xib 中初始化,兩者有何不同? uiview 是支援 nscoding 協議的,當在 xib 或 storyboard 裡存在乙個 uiview 的時候,其實是將 uiview 序列化到檔案裡(xib 和 storyboard 都是以 xml 格式來儲存的),載入的時候反序列化出來,所以:
當從**例項化 uiview 的時候,initwithframe 會執行;
當從檔案載入 uiview 的時候,initwithcoder 會執行。
如何封裝一組控制項?
比如拿uiscrollview 來講,實現乙個很容易,但是由於我會在專案中多次用到uiscrollview ,所以,需要把它再封裝一次,方便後面呼叫。
如果在多個頁面有相同的**或邏輯這時你就可以考慮分離公共**對它們進行封裝。你這裡的uiscrollview 要看你的需求,如果是只針對uiscrollview的某些公共部分的封裝,你可以直接繼承uiscrollview進行擴充套件。如果是uiscrollivew只是作為控制項封裝的一部分存在,而且還有一些與uiscrollview無關的邏輯,這時你就需要繼承更頂層的uiview來實現你的自定義控制項。
基本流程如下:
**實現:
C語言函式的封裝 未完待續
堅持 成長 每日一篇 返回 1表示讀取失敗,注意返回的資料是帶 n。else if ret 0 else return offset 讀取固定位元組,都到結尾返回已讀子節數,1表示讀取失敗 else if ret 0 else return offset 成功返回連線成功後的套接字,失敗返回 1。i...
nginx 未完待續
yum install y pcre yum install y pcre devel yum install y openssl yum install y openssl devel yum install y zlib yum install y gccyum安裝 yum install y ...
sqlparse(未完待續)
sqlparse.split sql,encoding none sql 包含乙個或多個sql語句的字串 encoding 語句的編碼 可選 sql select from foo select from bar sql list sqlparse.split sql print sql list ...