2011-09-09 49 views
4

由於各種原因,我正在考慮自己製作CATiledLayer。我已經做了一些調查,但我似乎無法弄清楚CATiledLayer如何知道要提供哪個圖塊。例如,當您滾動圖層時,setPosition:或setBounds:永遠不會被調用。它看起來像後臺線程只是調用drawLayer:inContext:的委託沒有任何觸發器的藍色。 我發現CATiledLayer調用了setContent:帶有一個「CAImageProvider」實例,並且所有對drawLayer:inContext:的調用都來自該類。所以很可能這是確定要繪製的圖塊的關鍵。但是我找不到這個類的任何文檔。CATiledLayer如何知道何時提供新瓷磚?

所以......有人知道這是如何工作的,以及我如何能夠覆蓋它?

至於CATiledLayer的缺點:

  • 它總是使用的屏幕分辨率(或X2,X4,等);您無法將其設置爲原始圖像的原始分辨率
  • 您無法指定比2更大的任何其他比例因子
  • 您必須指定levelsOfDetail和levelsOfDetailBias,對此我根本看不到任何實現原因。如果你的內容是無限可擴展的,比如分形,那麼這是非常有限的。
  • 最重要的是:如果你將其限制爲只在一個方向縮放(我這樣做,迫使一個方向的比例因子1的setTransform :),它充當所有怪異
+0

@fishiear:自從你的問題已經有一段時間了?我真的有同樣的問題。你解決了嗎?我必須完成3的縮放因子,並且還在尋找我自己的解決方案。但我不知道它是否好。你最後做了什麼?我想與你聯繫。你可以寫信給我。這對我來說非常重要。 – Fab1n

+0

@ Fab1n我沒有解決這個問題。我最後做的是每次知道顯示的內容會發生變化時(通過縮放和滾動以及新內容可用時),明確告知我的平鋪圖層實現。我可以與你分享代碼,給我你的電子郵件地址。 – fishinear

+0

感謝您的快速響應。我的電子郵件地址是ren dotonline at me dot com。哇讚賞代碼。認爲這爲我節省了很多時間。 – Fab1n

回答

1

drawLayer:inContext:,你可以使用CGContextGetClipBoundingBox獲取邊界框。 CGContextGetCTM應該爲您提供有關當前分辨率的信息。

+0

謝謝,但我知道。我正在查看catiledlayer如何知道何時向我發送drawlayer的信息:incontext消息。 – fishinear