2012-08-26 107 views
1

我已經從Apple的PhotoScroller示例代碼中提取了一些代碼以使用CATiledLayer。我有一個8000x7000px的圖像,通過互聯網加載。從超級視圖中移除後保留圖像

這是一種在我的應用程序中的地圖功能。我也有兩個幾乎相同的圖像,有不同的疊加層(試圖只添加覆蓋層而沒有運氣)。

我有一個UISegmentedControl在三個選擇之間切換,我希望imageView加載所選圖像的圖像。因此,如果用戶放大其中一個圖像並選擇另一個選項,則縮放和協調保持不變,並且imageView將所選圖像加載到必要的拼貼點中。

我已經部分管理了這一點。或者,我已經實際管理了這一點,但是當我選擇另一個選項時,調用功能[imageView removeFromSuperview];時整個屏幕變黑。在幾秒鐘之後黑色(取決於網速),它顯示正確的瓷磚。

如果可能,我希望圖層「淡入」到下一圖層。正如你所知道的,當使用CATiledLayer時,第一層是低分辨率的整個圖像,但是當放大時,必要的圖塊將「褪色」到具有較小圖塊的下一圖層。

我基本上需要給(TilingView*)imageView一個「重新加載」命令,並希望它在最後一個圖像上「淡入」。

我試圖將[imageView removeFromSuperview];註釋掉,這實際上讓我接近我想要的。當我放大並選擇另一個選項時,新圖像實際上已經淡出了舊圖像,但是,當我縮回時,舊圖像顯然滯留在背景中(在新圖像後面),不響應任何事情。我需要稍後從superView中刪除它,但由於新圖像作爲imageView取代了它的位置,因此我無法再訪問它。我知道人們可能希望在這裏看到代碼,但我真的不知道要顯示什麼代碼。而且這個CATiledLayer已經很少記錄了,我真的很難理解正在發生的事情。

+0

如果你正在加載全瓷磚而不是來自inet的jpegs,那似乎需要更多時間。您可能想要查看PhotoScrollerNetwork(在github上) - 它可以讓您下載jpegs,爲您進行拼貼,並允許併發下載。您也可以將它與Quartz only或libjpegturbo一起使用。 –

+0

@DavidH是的,我查了一下,但是不會花費更多時間?我想整個圖像必須下載imageview才能顯示任何內容?而不是隻需要瓷磚?由於這是一個地圖功能,因此用戶可能永遠不會查看所有圖像的整個深層圖像,因此不需要下載整個圖像。 – Sti

+0

如果您可以先下載第一個小視圖的圖塊,在時間上是一個巨大的勝利。 –

回答

1

我使它通過一些粗略的代碼工作。可能還有其他更好的解決方案,但這是目前我唯一知道的。

問題是,當我刪除[imageView removeFromSuperview];時,它沒有卸載最後的圖像,因此讓它永遠在內存中。由於它不受縮放和滾動的影響,所以當我縮小時,它總是在背景中。如果我要多次切換選項,多個圖像會在背景中加起來。

我簡單地創建了一個「helper」,我稱之爲。一個新的imageView,它在切換選項時獲取舊imageView的內容,但尚未從超級視圖中將其刪除,因爲過早刪除導致新圖像尚未加載時出現黑屏。

我現在請的委託方法scrollViewWillBeginZooming並在scrollViewWillBeginDragging[helper removeFromSuperview];。這會導致在單擊其他選項和用戶滾動或縮放之間最多包含兩個圖像的內存。

注意:如果用戶在UISegmentedControl中切換選項後立即滾動或縮放,它會變黑,因爲新圖像尚未加載。

相關問題