gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 04:42:29 24 4
gpt4 key购买 nike

当父级 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com