objective-c - 在第 3 代 iPad 中放大时删除和刷新 CATiledLayer

标签 objective-c ios ipad pdf catiledlayer

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

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

缩放后出现问题。如果我放大然后不理会 iPad,显示的图像会模糊然后重新锐化。看起来 CATiledLayer 正在被删除,因为我在后 View 中看到模糊的低分辨率图像,然后 CATiledLayer 被重新绘制,即我看到平铺效果和图像的重新锐化。如果我不理会应用程序并等待大约 30 到 40 秒,就会发生这种情况。我只在第三代 iPad(新 iPad、iPad3 等)上观察到它。我也在 iPad2s 上测试,我还没有遇到这个问题。

有没有人遇到过这个问题?任何已知原因和可能的解决方案?

编辑:

我的 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
}

虽然不确定这会有多大帮助,因为在问题发生时 ScrollView 没有接收到输入。如上所述,pdf 页面加载到 CATiledLayer,然后我不理会 iPad(设备未接收到任何输入),CATiledLayer 将自行重绘。

我还 try catch 对 setNeedsDisplaysetNeedsDisplayInRect:setNeedsLayoutsetNeedsDisplayOnBoundsChange: 的调用 View 和平铺层,但是重绘是在没有调用任何这些函数的情况下发生的。 drawLayer:inContext: 当然会被调用,但是跟踪只显示了一些在后台线程中启动的 Quartz 调用(正如预期的那样,因为平铺层在后台准备内容),所以它是也没有帮助。

提前致谢!

最佳答案

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

关于objective-c - 在第 3 代 iPad 中放大时删除和刷新 CATiledLayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10432675/

相关文章:

objective-c - OS X 音频编程通用教程

iphone - 如何生成兼容 Objective-C 语法的 JSON 字符串

objective-c - 如何在 Objective-C 中使用运行时反射解析属性 getter/setter 方法选择器? (或相反)

iphone - 奇怪的 NSDate 和 NSDateFormatter 行为

iphone - iOS 核心数据 - 关系

iphone - AFnetworking waitUntilFinish 不工作

iphone - 如何从url接收图像以及如何发布图像?

objective-c - 数据密集型 View 的加载屏幕

css - 没有 Less 的 Bootstrap 菜单折叠更改?

css - 响应式设计适用于浏览器,不适用于 Landscape Ipad