在放大iPad 3rd gen时,CATiledLayer被删除并刷新

Alt*_*ice 5 pdf objective-c ipad catiledlayer ios

当父UIScrollView放大时,我在CATiledLayer上遇到重绘问题.

我在CATiledLayer支持的UIView中呈现PDF页面.它后面还有另一个UIImageView,它包含了CATiledLayer将绘制的页面的低分辨率图像.当我放大时,它按预期工作.CATiledLayer将根据缩放级别渲染更高分辨率的图像.

缩放后会出现此问题.如果我放大然后只留下iPad,显示的图像会模糊然后重新加强.看起来像CATiledLayer被删除,因为我在后备视图中看到模糊的低分辨率图像,然后重新绘制了CATiledLayer,即我看到了平铺效果和图像的重新锐化.如果我只是单独离开应用程序并等待大约30到40秒,就会发生这种情况.我只是在iPad第三代(新iPad,iPad3等)上观察过它.我也在iPad2上测试,我还没有遇到这个问题.

还有其他人遇到过这个问题吗?任何已知的原因,可能还有解决方案?

编辑:

我的UIScrollViewDelegate方法如下:

// currentPage, previousPage, and nextPage are the pdf page views
// that are having the refresh problem 

- (void)positionBufferedPages { 
  // performs math {code omitted}

  // then sets the center of the views
  [previousPage.view setCenter:...];        
  [nextPage.view setCenter:...];
}

- (void)hideBufferedPages {
  if ([previousPage.view isDescendantOfView:scrollView]) {
    [previousPage.view removeFromSuperview];
  }

  if ([nextPage.view isDescendantOfView:scrollView]) {
    [nextPage.view removeFromSuperview];
  }          
}

- (void)showBufferedPages {
  if (![previousPage.view isDescendantOfView:scrollView]) {
    [scrollView addSubview:previousPage.view];
  }

  if (![nextPage.view isDescendantOfView:scrollView]) {
    [scrollView addSubview:nextPage.view];
  }

  if (![currentPage.view isDescendantOfView:scrollView]) {
    [scrollView addSubview:currentPage.view];
  }
} 

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
  return currentPage.view;
}

- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view {
  [self hideBufferedPages];
}

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollViewParam withView:(UIView *)view atScale:(float)scale {
  [self positionBufferedPages];
  [self showBufferedPages];    
}

- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
  // nothing relating to the pdf page view
  // but does set the center of some other subviews on top of the pdf page views
}
Run Code Online (Sandbox Code Playgroud)

不确定这会有多大帮助,因为当问题发生时,scrollview没有收到输入.如上所述,pdf页面被加载到CATiledLayer,然后我独自离开iPad(设备没有收到任何输入),CATiledLayer将自行重绘.

我还试图抓住调用setNeedsDisplay,setNeedsDisplayInRect:,setNeedsLayout,和setNeedsDisplayOnBoundsChange:双方的观点和瓷砖层,但重绘没有发生任何的那些函数获取调用.drawLayer:inContext:当然会被调用,但跟踪只显示一些Quartz调用是在后台线程中启动的(正如预期的那样,因为平铺层在后台准备内容),所以它也没有任何帮助.

提前致谢!

Jos*_*uer 2

您的应用程序的内存使用情况如何?如果发生内存警告,CATiledLayer 将丢弃其缓存并重新绘制。我已经看到即使没有向应用程序发送内存警告(只是比平常的内存负载更高),它也会这样做。使用 Instruments 查看内存使用情况。您可能需要使用 OpenGL ES 驱动程序工具来查看图形内存的情况。