設定陰影時的效能優化

2021-07-02 03:30:51 字數 1402 閱讀 4744

ios上,給檢視加上陰影很容易。只需要:

在專案中加上quartzcore框架

在實現檔案中import quartzcore的標頭檔案

加上這樣的一行**[myview.layer setshadowopacity:0.5]

瞧!陰影加上了。

image

然而,最簡單的方法通常都不是效能最好的方法。 如果你要用這個檢視作動畫(特別當它是乙個uitableviewcell的一部分的時候),你可能會注意到動畫的卡頓。這是因為在計算檢視的陰影的時候,為了計算出到底應該怎麼渲染檢視的陰影,core animation需要做乙個螢幕外的渲染通道(do an offscreen rendering pass)才能確定檢視的形狀。(記住,你的檢視可能是任何一種複雜的圖形,甚至它上面可能還帶有孔洞)

為了證明這一點。現在開啟模擬器,勾選上「除錯」選單中的「螢幕外渲染的顏色」選項。

image

或者,接上乙個裝置,啟動instruments(⌘i),選擇core animation模板,選中core animation欄,勾上」color offscreen-rendered yellow」選項。

image

然後在模擬器上(或者裝置上),你就會看到類似下面的這種東西:

image

這說明,某些東西正在強制的產生乙個昂貴的螢幕外渲染通道。

幸運地是,修正這個陰影的效能問題和新增陰影的操作一樣簡單。你只需要告訴core animation你的檢視是什麼形狀的就行了。用view.layer的setshadowpath:方法:

[

myview

.layer

setshadowpath:

[[uibezierpath

bezierpathwithrect:

myview

.bounds

]cgpath

]];

(注意:這裡可能因為檢視不同的形狀,**有所不同。uibezierpath有許多方便的方法可以呼叫。比如如果你的檢視有圓角,可以使用bezierpathwithroundedrect:cornerradius:方法。)

現在測試一下,用於指示螢幕外渲染內容的黃色區塊應該消失了吧。

每當你的檢視的bounds變化後,你需要更新layer的陰影路徑(shadowpath)。同樣的,如果你做乙個bounds變化的動畫,你也需要給layer的陰影路徑做乙個動畫來匹配bounds的變化。給layer的陰影路徑做動畫需要用到caanimation,因為uiview不能直接對shadowpath做動畫(shadowpath是calayer的屬性)。用cakeyframeanimation可以很簡單地對shadowpath做乙個動畫,只需要從乙個cgpath變化到另乙個cgpath就可以了。

2 陰影的設定

text shadow是給文字新增陰影效果,box shadow是給元素塊新增周邊陰影效果。基本語法是 物件選擇器 box shadow屬性的引數設定取值 陰影型別 此引數可選。如不設值,預設投影方式是外陰影 如取其唯一值 inset 其投影為內陰影 x offset 陰影水平偏移量,其值可以是正負...

網頁效能優化,快取優化 載入時優化 動畫優化

訪問頁面,請求各種資源,瀏覽器檢查本地是否有快取。如果有,檢查資源是否過期。沒過期,直接使用快取。過期了,便向伺服器發出請求。發出的請求中會帶上etag和last modified首部字段。伺服器會通過etag和last modified來判斷瀏覽器快取的資源是否已經不可用。如果資源仍然有效,便返回...

分頁查詢時如何優化MySQL的效能?

一般情況下,用typecho或者wordpress做部落格系統,資料量都不大,所以大家都很少遇到分頁導致的效能問題。然而,當資料量上公升 譬如做大量產品資料的企業 mysql的分頁查詢效能問題將越來越明顯。如何通過mysql更好的實現分頁,始終是比較令人頭疼的問題。雖然沒有拿來就能用的解決辦法,但了...