[英]Drawing a very large zoomable, pannable content over tiles (UIViews) : iOS
跨圖塊(UIViews)繪制可縮放,可縮放的大型內容的最佳方法是什么? 我無法使用CATiledLayer,因為其中的某些內容僅在達到特定縮放級別(如在地圖中)后進行放大時才可見。 我正在繪制的內容是一個大圖(條形圖,線圖等),它將根據提供的圖數據動態呈現。
從Apple的文檔在這里
看起來您應該使用平鋪,並避免創建非常大的視圖。 我正在使用這種方法來平鋪效果很好的視圖: 平鋪
現在最困難的部分是確定哪些內容遍歷特定的圖塊(例如, 第r行和第c列的tile(r,c))。 我嘗試過的一種解決方案是為每個圖塊繪制全部內容,然后根據圖塊的位置對其進行轉換,但是隨着用戶滾動,這會變得非常緩慢且不穩定。
使用上述方法,為特定圖塊確定內容的更快方法是什么? (這與蘋果公司為CATiledLayer提供內容的方式有關)
要么
我可以考慮解決上述問題的替代方法嗎?
我已經在Mac應用程序中完成了此操作,其中視圖的內容可能不適合RAM。
首先,您肯定要使用UIScrollView
。 正確滾動非常復雜,除非准備編寫十萬行代碼,否則請勿嘗試自行滾動。
將UIView子類嵌入滾動視圖中,並監視滾動視圖以查看可見區域(和縮放級別)的變化。
只要可見區域發生變化,就從視圖中相應地添加/刪除CALayer對象。
麻煩的是,您無法在用戶滾動時更新圖層,這太慢了。 因此,等待用戶停止滾動,然后更新圖層。 並且在可見邊界之外的區域中具有足夠的可見層,因此用戶不會注意到。
這是我處理延遲更新的方法:
- (void)userDidScroll
{
// wait until the user has stopped scrolling, then process scroll
static NSDate *lastScrollDate = nil;
lastScrollDate = [NSDate date];
NSDate *thisScrollDate = lastScrollDate.copy;
double delayInSeconds = 1.0; // how long after the scroll should we update?
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
if (thisScrollDate != lastScrollDate)
return;
lastScrollDate = nil;
[self updateLayer];
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.