当父 UIScrollView 放大时,我在 CATiledLayer 上遇到重绘问题。
我在 CATiledLayer 支持的 UIView 中呈现 PDF 页面。它后面有另一个 UIImageView,其中包含 CATiledLayer 将绘制的页面的低分辨率图像。当我放大时,它按预期工作。CATiledLayer 将根据缩放级别渲染更高分辨率的图像。
缩放后出现问题。如果我放大然后只留下 iPad,显示的图像会模糊然后重新锐化。看起来 CATiledLayer 正在被移除,因为我在背景视图中看到模糊的低分辨率图像,然后 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
}
不确定这会有多大帮助,因为当问题发生时,滚动视图没有接收到输入。如上所述,pdf页面加载到CATiledLayer,然后我不理会iPad(设备没有接收到输入),CATiledLayer会自行重绘。
我还尝试在视图和平铺层上捕获对setNeedsDisplay
、setNeedsDisplayInRect:
、setNeedsLayout
和的调用setNeedsDisplayOnBoundsChange:
,但是重绘发生时没有调用任何这些函数。drawLayer:inContext:
当然会被调用,但是跟踪仅显示在后台线程中启动了一些 Quartz 调用(正如预期的那样,因为平铺层在后台准备内容),所以它也无济于事。
提前致谢!