CAReplicatorLayer

来源:http://www.cnblogs.com/EchoHG/archive/2017/10/03/7623734.html
-Advertisement-
Play Games

CAReplicatorLayer CAReplicatorLayer的目的是為了高效生成許多相似的圖層。它會繪製一個或多個圖層的子圖層,併在每個複製體上應用不同的變換。看上去演示能夠更加解釋這些,我們來寫個例子吧。 重覆圖層(Repeating Layers) 清單6.8中,我們在屏幕的中間創建了 ...


CAReplicatorLayer

CAReplicatorLayer的目的是為了高效生成許多相似的圖層。它會繪製一個或多個圖層的子圖層,併在每個複製體上應用不同的變換。看上去演示能夠更加解釋這些,我們來寫個例子吧。

重覆圖層(Repeating Layers)

清單6.8中,我們在屏幕的中間創建了一個小白色方塊圖層,然後用CAReplicatorLayer生成十個圖層組成一個圓圈。instanceCount屬性指定了圖層需要重覆多少次。instanceTransform指定了一個CATransform3D3D變換(這種情況下,下一圖層的位移和旋轉將會移動到圓圈的下一個點)。

變換是逐步增加的,每個實例都是相對於前一實例佈局。這就是為什麼這些複製體最終不會出現在同意位置上,圖6.8是代碼運行結果。

清單6.8 用CAReplicatorLayer重覆圖層

 1 @interface ViewController ()
 2 
 3 @property (nonatomic, weak) IBOutlet UIView *containerView;
 4 
 5 @end
 6 
 7 @implementation ViewController
 8 - (void)viewDidLoad
 9 {
10     [super viewDidLoad];
11     //create a replicator layer and add it to our view
12     CAReplicatorLayer *replicator = [CAReplicatorLayer layer];
13     replicator.frame = self.containerView.bounds;
14     [self.containerView.layer addSublayer:replicator];
15 
16     //configure the replicator
17     replicator.instanceCount = 10;
18 
19     //apply a transform for each instance
20     CATransform3D transform = CATransform3DIdentity;
21     transform = CATransform3DTranslate(transform, 0, 200, 0);
22     transform = CATransform3DRotate(transform, M_PI / 5.0, 0, 0, 1);
23     transform = CATransform3DTranslate(transform, 0, -200, 0);
24     replicator.instanceTransform = transform;
25 
26     //apply a color shift for each instance
27     replicator.instanceBlueOffset = -0.1;
28     replicator.instanceGreenOffset = -0.1;
29 
30     //create a sublayer and place it inside the replicator
31     CALayer *layer = [CALayer layer];
32     layer.frame = CGRectMake(100.0f, 100.0f, 100.0f, 100.0f);
33     layer.backgroundColor = [UIColor whiteColor].CGColor;
34     [replicator addSublayer:layer];
35 }
36 @end
View Code

 

Swift 3.0 代碼

 1 //    CAReplicatorLayer
 2     private lazy var replicatorView: UIView! = UIView()
 3 
 4 func replicatorLayerOfView()  {
 5         self.view.addSubview(self.replicatorView)
 6         let replicator = CAReplicatorLayer()
 7         replicator.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
 8         self.replicatorView.layer.addSublayer(replicator)
 9         
10         replicator.instanceCount = 10
11         
12         var transform = CATransform3DIdentity
13         transform = CATransform3DTranslate(transform, 0, 200, 0)
14         transform = CATransform3DRotate(transform, .pi / 5.0, 0, 0, 1)
15         transform = CATransform3DTranslate(transform, 0, -200, 0)
16         replicator.instanceTransform = transform
17         
18         replicator.instanceBlueOffset = -0.1
19         replicator.instanceGreenOffset = -0.1
20         
21         let layer = CALayer()
22         layer.frame = CGRect(x: 30, y: 30, width: 30, height: 30)
23         layer.backgroundColor = UIColor.white.cgColor
24         replicator.addSublayer(layer)
25         
26         self.replicatorView.snp.makeConstraints { (make) in
27             make.top.equalTo(self.gradientView)
28             make.size.equalTo(self.gradientView)
29             make.left.equalTo(self.gradientView.snp.right).inset(-10)
30         }
31         
32     }
View Code

 

 

 

圖6.8 用CAReplicatorLayer創建一圈圖層

註意到當圖層在重覆的時候,他們的顏色也在變化:這是用instanceBlueOffsetinstanceGreenOffset屬性實現的。通過逐步減少藍色和綠色通道,我們逐漸將圖層顏色轉換成了紅色。這個複製效果看起來很酷,但是CAReplicatorLayer真正應用到實際程式上的場景比如:一個游戲中導彈的軌跡雲,或者粒子爆炸(儘管iOS 5已經引入了CAEmitterLayer,它更適合創建任意的粒子效果)。除此之外,還有一個實際應用是:反射。

 

反射

使用CAReplicatorLayer並應用一個負比例變換於一個複製圖層,你就可以創建指定視圖(或整個視圖層次)內容的鏡像圖片,這樣就創建了一個實時的『反射』效果。讓我們來嘗試實現這個創意:指定一個繼承於UIViewReflectionView,它會自動產生內容的反射效果。實現這個效果的代碼很簡單(見清單6.9),實際上用ReflectionView實現這個效果會更簡單,我們只需要把ReflectionView的實例放置於Interface Builder(見圖6.9),它就會實時生成子視圖的反射,而不需要別的代碼(見圖6.10).

清單6.9 用CAReplicatorLayer自動繪製反射

 1 #import "ReflectionView.h"
 2 #import 
 3 
 4 @implementation ReflectionView
 5 
 6 + (Class)layerClass
 7 {
 8     return [CAReplicatorLayer class];
 9 }
10 
11 - (void)setUp
12 {
13     //configure replicator
14     CAReplicatorLayer *layer = (CAReplicatorLayer *)self.layer;
15     layer.instanceCount = 2;
16 
17     //move reflection instance below original and flip vertically
18     CATransform3D transform = CATransform3DIdentity;
19     CGFloat verticalOffset = self.bounds.size.height + 2;
20     transform = CATransform3DTranslate(transform, 0, verticalOffset, 0);
21     transform = CATransform3DScale(transform, 1, -1, 0);
22     layer.instanceTransform = transform;
23 
24     //reduce alpha of reflection layer
25     layer.instanceAlphaOffset = -0.6;
26 }
27 28 - (id)initWithFrame:(CGRect)frame
29 {
30     //this is called when view is created in code
31     if ((self = [super initWithFrame:frame])) {
32         [self setUp];
33     }
34     return self;
35 }
36 
37 - (void)awakeFromNib
38 {
39     //this is called when view is created from a nib
40     [self setUp];
41 }
42 @end
View Code

 


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

-Advertisement-
Play Games
更多相關文章
  • 屬性動畫 CAAnimationDelegate在任何頭文件中都找不到,但是可以在CAAnimation頭文件或者蘋果開發者文檔中找到相關函數。在這個例子中,我們用-animationDidStop:finished:方法在動畫結束之後來更新圖層的backgroundColor。 當更新屬性的時候, ...
  • 呈現與模型 CALayer的屬性行為其實很不正常,因為改變一個圖層的屬性並沒有立刻生效,而是通過一段時間漸變更新。這是怎麼做到的呢? 當你改變一個圖層的屬性,屬性值的確是立刻更新的(如果你讀取它的數據,你會發現它的值在你設置它的那一刻就已經生效了),但是屏幕上並沒有馬上發生改變。這是因為你設置的屬性 ...
  • 圖層行為 現在來做個實驗,試著直接對UIView關聯的圖層做動畫而不是一個單獨的圖層。清單7.4是對清單7.2代碼的一點修改,移除了colorLayer,並且直接設置layerView關聯圖層的背景色。 清單7.4 直接設置圖層的屬性 1 @interface ViewController () 2 ...
  • 事務 Core Animation基於一個假設,說屏幕上的任何東西都可以(或者可能)做動畫。動畫並不需要你在Core Animation中手動打開,相反需要明確地關閉,否則他會一直存在。 當你改變CALayer的一個可做動畫的屬性,它並不能立刻在屏幕上體現出來。相反,它是從先前的值平滑過渡到新的值。 ...
  • AVPlayerLayer 最後一個圖層類型是AVPlayerLayer。儘管它不是Core Animation框架的一部分(AV首碼看上去像),AVPlayerLayer是有別的框架(AVFoundation)提供的,它和Core Animation緊密地結合在一起,提供了一個CALayer子類來 ...
  • 1. 下載Charles Proxy 4.2版本,百度雲盤下載或去官網下載 2. 安裝後先打開Charles一次(Windows版可以忽略此步驟) 3. 在這個網站(http://charles.iiilab.com/)下載破解文件 charles.jar 4. 替換掉原文件夾里的charles.j ...
  • Android 設置是每個App必不可小的東西,看似很簡單,但是初學不熟悉的很花時間去研究,特別樣式相容方面,以及有自定義設置的需求,下麵是對用法做一個總結 ...
  • CATiledLayer 有些時候你可能需要繪製一個很大的圖片,常見的例子就是一個高像素的照片或者是地球錶面的詳細地圖。iOS應用通暢運行在記憶體受限的設備上,所以讀取整個圖片到記憶體中是不明智的。載入大圖可能會相當地慢,那些對你看上去比較方便的做法(在主線程調用UIImage的-imageNamed: ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...