CoreAnimation 寄宿圖

来源:http://www.cnblogs.com/xubaoaichiyu/archive/2017/03/14/6547833.html
-Advertisement-
Play Games

CoreAnimation 寄宿圖 博客園makedown支持不佳,如有需要請進 "GitHub" . 寄宿圖:圖層中所包含的圖 by:旭寶愛吃魚     針對於寄宿圖我在這裡只討論contents屬性以及Custom Drawing. contents &n ...


CoreAnimation 寄宿圖


博客園makedown支持不佳,如有需要請進GitHub.

寄宿圖:圖層中所包含的圖 by:旭寶愛吃魚

    針對於寄宿圖我在這裡只討論contents屬性以及Custom Drawing.

contents

content:內容

    CALayer的contents屬性是一個id類型.

@property(nullable, strong) id contents;

    因此,可以將任何類型的對象賦值給contents,但是如果將非CGImage類型的對象賦值給contents將會的到一個空白頁.contents之所以會存在這種現象是因為Mac OS的歷史原因造成的.
    原因: contents對CGImage類型的對象以及NSImage類型的對象都起作用!
    然而問題並不是只有這麼一點點,我們可以嘗試將UIImage的CGImage賦值給contents,不幸的是將會得到一個編譯報錯,產生錯誤的原因是CGImage返回的CGImageRef並不是一個Cocoa對象而是CoreFoundation類型,這時我們需要用bridged關鍵字進行轉換(MRC下不需要).

layer.contents = (__bridge id)image.CGImage;

    下麵我們把一張圖片賦值給contents.

    為了便於對比我將原圖粘貼於此

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIImage * layerImage = [UIImage imageNamed:@"goddess"];
    
    // 在圖層上添加圖片
    self.customView.layer.contents = (__bridge id)layerImage.CGImage;// 圖片一 
}

    展示效果如下:

    通過兩行代碼我們將GODDESS添加到圖層之上,但是與原圖相比我們發現goddess變胖了許多,我們不希望見到這中效果,因此我們需要對contentGravity屬性進行設置.

contentGravity

contentGravity:圖層的展示類型.

    CALayer的contentsGravity屬性是一個NSString類型.

@property(copy) NSString *contentsGravity;

    contentsGravity並沒有採取枚舉類型的賦值方式,因此我在這裡列出其相應的賦值範圍.

  • kCAGravityCenter
  • kCAGravityTop
  • kCAGravityBottom
  • kCAGravityLeft
  • kCAGravityRight
  • kCAGravityTopLeft
  • kCAGravityTopRight
  • kCAGravityBottomLeft
  • kCAGravityBottomRight
  • kCAGravityResize
  • kCAGravityResizeAspect
  • kCAGravityResizeAspectFill

    為了改變上面結果的缺陷我們添加以下代碼:

layer.contentsGravity = kCAGravityResizeAspect;

    得到以下效果:

contentsScale

contentsScale:像素尺寸與試圖大小的比例(預設1.0).

    contentsScale屬性是為了適配高分辨的屏幕機制,如果我們將其設置為1.0我們的得到的便是一個點由兩個像素組成,如果將其設置為2.0我們得到的便是一個點由兩個像素組成.
    一般狀態下我們設置的方式如下:

layer.contentsScale = [UIScreen mainScreen].scale;

    註意:
    當我們能設置contentsGravity自動拉伸類狀態時,設置contentsScale是沒有效果的,因為contentsGravity已經對圖層的展示進項了拉伸適配,如果我們需要查看設置contentsScale的效果我們可以將contentsGravity設置為kCAGravityCenter;

maskToBounds

maskToBounds:
YES(不展示圖層以外的內容)
NO(展示圖層以外的內容)

    代碼示例:

layer. maskToBounds = YES;

    iOS視圖預設允許我們將一個尺寸較大的圖層添加到一個尺寸較小的圖層上並加以展示,但是此時處於父圖層以外的子圖層區域的點擊等交互事件是監聽不到的,以及其他展示效果的影響我們在許多非正常佈局的情況下我們需要將maskToBounds設置為YES.或者UIView的clipsToBounds屬性設置為YES.

contentsRect

contentsRect:允許在圖層範圍內顯示寄宿圖的一個子域.
{x,y,w,h} 四個參數的取值範圍是0~1.

    預設狀態下contentsRect的取值是{0,0,1,1},也就是預設狀態下是顯示整個寄宿圖,也就是如下圖的效果.

    如我我們將contentsRect的取值設置為{0.5, 0.5, 0.5, 0.5},效果就變成如下圖所示:

    在app中contentsRect比較典型的用法就是圖片拼合用法,也就是我們所需要展示的許多內容都在一張Image上,但是展示時通過contentsRect我們將他們一一取出,這樣就極大的節約了記憶體的使用率.

contentsCenter

contentsCenter:並不是contents的中心點,而是定義了一個固定的邊框和一個在圖層上可拉伸的區域.

    contentsCenter使用效果和UIImage里的-resizableImageWithCapInsets: 方法效果非常類似,但是它可以運用到任何寄宿圖,甚至包括在Core Graphics運行時繪製的圖形,在這裡就不多贅述具體的操作方法.

Custom Drawing

Custom Drawing:自定義繪製.

UIView-drawRect

    -drawRect並不是一個十分陌生的方法,每當我麽自定義UIView的時候都可一看到他的身影,他的本身含以也正如我們自定義UIView的意圖,我們可以通過他實現自定義繪製寄宿圖.
    -drawRect:方法是沒有被蘋果預設實現的,因為對與UIView來說,寄宿圖不是他所必須.如果UIView檢測到-drawRect:方法被實現了,那麼UIView會為視圖分配一個寄宿圖,寄宿圖的像素尺寸等於視圖大小乘以 contentsScale的值。需要註意的是如果我們不需要使用寄宿圖我們不要實現-drawRect:,因為這會造成CPU以及記憶體的不必要浪費,當然apple也是這麼建議的.
    -drawRect:的調用是在視圖出現在屏幕的時候,-drawRect:利用其封裝的代碼通過CoreGraphics來繪製一個寄宿圖,當寄宿圖繪製結束後會被緩存起來,直到它需要更新的時候(通過調用-setNeedsDisplay)去重新繪製更新.

CALayer-displayLayer:&&-drawLayer:inContext:

-displayLayer:對象方法
-drawLayer:inContext:代理方法

    我們可以通過CALayerDelegate-drawLayer:inContext:來實現自定義繪製圖層.需要做的內容很簡單,設置layer的代理,然後實現-drawLayer:inContext:方法,當我們需要更新繪製的時候調用-displayLayer:即可.

    註意:

  • CALayer不同於UIView,當圖層顯示在屏幕上時,CALayer不會自動重繪它的內容,它把重繪的決定權交給了開發者。
  • 當使用CALayerDelegate繪製寄宿圖的時候,並不會對超出邊界外的內容進行繪製。

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

-Advertisement-
Play Games
更多相關文章
  • 1. 使用流程 2. 常用屬性   numColumns:指定顯示的列數,若不指定該屬性,則預設所有項排成1列。   verticalSpacing:行距。   horizontalSpacing:列距,若指定了numColumns,則按照 ...
  • 單例模式是非常常見的設計模式,其含義也很簡單,一個類給外部提供一個唯一的實例。下文所有的代碼均在 "github" 源碼整個項目不僅僅有設計模式,還有其他JavaSE知識點,歡迎Star,Fork 單例模式的UML圖 單例模式的關鍵點 通過上面的UML圖,我們可以看出單例模式的特點如下: 1. 構造 ...
  • 之前寫了篇Android OkHttp完全解析 是時候來瞭解OkHttp了,其實主要是作為okhttp的普及文章,當然裡面也簡單封裝了工具類,沒想到關註和使用的人還挺多的,由於這股熱情,該工具類中的方法也是劇增,各種重載方法,以致於使用起來極不方便,實在慚愧。 於是,在這個周末,抽點時間對該工具類... ...
  • 指定移動的像素的上偏移值 //實現男、女的單選控制項 ...
  • 轉載請標明出處: "http://www.cnblogs.com/why168888/p/6548544.html" 本文出自: "【Edwin博客園】" 如何簽名: jarsgner verbose keystore[keystorePath] singnedjar [apkOut] [apkln ...
  • 偶爾才用一次的JEB, 出現 “Controller沒有響應或者無法訪問, JEB即將終止.” 也懶得去逆了。直接用ProcessHacker找到對應的線程掛起即可。當然這隻是臨時的辦法。。我也只是臨時用用。有興趣的自己做工具吧。 ...
  • Swift _ OC _ 混編 在OC環境下使用Swift. "GitHub源碼" ...
  • 前言 自Weex發佈伊始, 其口號 "Write Once, Run Everywhere"就吸引了大批前端與客戶端程式猿紛紛入坑, 我也不能獨善其中. 就我目前所學習Weex的經驗在此記錄一下, 由於我是一名剛入行不久iOS開發者, 所以這篇博客含金量不高, 下麵就簡單闡述下如何將Weex初步集成 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...