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调用是在后台线程中启动的(正如预期的那样,因为平铺层在后台准备内容),所以它也没有任何帮助.
提前致谢!
您的应用程序的内存使用情况如何?如果发生内存警告,CATiledLayer 将丢弃其缓存并重新绘制。我已经看到即使没有向应用程序发送内存警告(只是比平常的内存负载更高),它也会这样做。使用 Instruments 查看内存使用情况。您可能需要使用 OpenGL ES 驱动程序工具来查看图形内存的情况。