2012-06-18 39 views
9

我有CATiledLayer支持的視圖。我想從該CATiledLayer UIView中獲取可見的圖塊,並將其添加到另一個視圖作爲其CALayer支持,從而在不使用CATiledLayer的另一個UIView中重新創建可見圖像。CATiledLayer到CALayer

我想這樣做的原因是我將使用這第二個UIView來掩蓋更新CATiledLayer支持的UIView的效果 - 當所有瓷磚重新加載時,這會產生閃爍。

問題是,我不完全確定我會如何做到這一點。有任何想法嗎?

+1

所以,你要採取故意平鋪視圖並進行正常的視圖隱藏平鋪視圖...?也許是一個瘋狂的問題,但爲什麼它開始平鋪? –

+0

@PauldeLange - 當我的平鋪視圖重新加載時,它會在重新繪製圖塊時「閃爍」。在平鋪視圖下面將會有一個UIView,它將成爲上面瓦片的直接副本。然後,當瓷磚重新加載時,隨着瓷磚被重新加載,底部視圖將在瞬間顯示,從而停止閃爍影響。從我可以告訴的是,這是圖形程序的一個相當常見的做法 - 使用圖形緩衝區來平滑渲染上述任何新內容的影響。 –

+0

如果你可以渲染背景視圖的速度比瓷磚快,爲什麼你有瓷磚?影響 - >影響。 –

回答

3

CATiledLayer是的CALayer提供一種方法來 異步提供層的內容的地磚,潛在 在多個細節級別緩存的子類。

可以渲染在層可見的東西變成CGContextRef有:

- (void)renderInContext:(CGContextRef)ctx 

然後使用這個通過設置來更新你的其它層的代表和執行

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context 

ss這裏顯示http://www.raywenderlich.com/2502/introduction-to-calayers-tutorial

但老實說,我不認爲這是有效的。

+0

感謝您的回答。你說這不是有效的。你有任何其他想法可以幫助解決我的閃爍問題嗎? –

+0

@Luis'renderInContext'對於'CATayLayer'似乎不起作用,就像'CALayer'一樣。瓷磚根本不渲染。有任何想法嗎? – Tim

0

這裏你真正的問題是閃爍。我有一個自定義CALayer的視圖類似的問題支持它,這是解決方案的一部分: 創建您的CALayer的自定義子類,並實現以下方法:

- (void) display { 
    self.contents = nil; 
    [super display]; 
} 

這個固定的一組問題的我,但可能無法爲你解決。你的選擇可能是當你更新禁用交易: 從CATransaction Class Reference

setDisableActions:動作設定是否觸發作爲該業務羣被抑制內作出 性質變化的結果。

所以使用這個:

[CATransaction begin]; 
[CATransaction setDisableActions:YES]; 
// do updating/flickering stuff 
[self doFlickeringThing]; 
[CATransaction commit];