簡體   English   中英

在圖塊(UIViews)上繪制非常大的可縮放,可縮放內容:iOS

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM