【问题标题】:iphone: error and pdf pages questioniphone:错误和pdf页面问题
【发布时间】:2011-03-30 16:48:54
【问题描述】:

我正在构建一个 pdf 查看器应用程序。我的技能现在处于中等 LOL 巫毒水平......我已经靠自己的这个应用程序走了很远,但我对我的理论或我的代码非常困惑。我的应用程序有一个分页滚动视图,它使其自身成为整个 pdf 文档的长度,然后它在另一个滚动视图 (ImageScrollView) 中显示当前页面,这是它自己的类。 ImageScrollView 制作了一个 UIView ,它可以完成 CATiledLayer 通常的工作,并且一切正常! :)

我的 ImageScrollView 显示屏幕页面(当您滚动到下一页时,ImageScrollView 再次在屏幕上加载 CATiledLayer,您可以看到图块)。我一直在研究如何让当前页面的左右页面预加载(因为我不认为将 pdf 加载为屏幕上的图块对用户体验有好处)但我不确定我是否我的想法是正确的。

也许我应该在 ImageScrollView 中的屏幕 UIView 旁边制作一个左右 UIView?

或者它可能与回收不再可见的页面有关,如下所示(但我认为我仍然需要左/右视图,甚至我仍然不需要回收视图??)

- (void)tilePages {
// Calculate which pages are visible
CGRect visibleBounds = pagingScrollView.bounds;//CGRect visibleBounds =     CGRectMake(0.0f, 0.0f, 320.0f * [self pdfPageCount], 435.0f);
int firstNeededPageIndex = floorf(CGRectGetMinX(visibleBounds) / CGRectGetWidth(visibleBounds));
int lastNeededPageIndex  = floorf((CGRectGetMaxX(visibleBounds)-1) / CGRectGetWidth(visibleBounds));


firstNeededPageIndex = MAX(firstNeededPageIndex, 0);
lastNeededPageIndex  = MIN(lastNeededPageIndex, [self pdfPageCount] - 1);

// Recycle no-longer-visible pages 
for (ImageScrollView *page in visiblePages) {

    if (page.index < firstNeededPageIndex || page.index > lastNeededPageIndex) {
        [recycledPages addObject:page];
        [page removeFromSuperview];}}
[visiblePages minusSet:recycledPages];

// add missing pages
for (int index = firstNeededPageIndex; index <= lastNeededPageIndex; index++) {
    if (![self isDisplayingPageForIndex:index]) {
        ImageScrollView *page = [self dequeueRecycledPage];
        if (page == nil) {
            page = [[[ImageScrollView alloc] init] autorelease];}
        [self configurePage:page forIndex:index];
        [pagingScrollView addSubview:page];
        [visiblePages addObject:page];}}}

我更改了代码以查看下面发生了什么(不确定)我也得到错误:初始化使指针从整数而不进行强制转换

- (void)tilePages:(NSUInteger) index {                
// Calculate which pages are visible
CGRect visibleBounds = pagingScrollView.bounds;
int firstNeededPageIndex = floorf(CGRectGetMinX(visibleBounds) / CGRectGetWidth(visibleBounds));
int lastNeededPageIndex  = floorf((CGRectGetMaxX(visibleBounds)-1) / CGRectGetWidth(visibleBounds));
firstNeededPageIndex = MAX(firstNeededPageIndex, 0);
lastNeededPageIndex  = MIN(lastNeededPageIndex, [self pdfPageCount] - 1);
// Recycle no-longer-visible pages 
for (ImageScrollView *page in visiblePages) {
    if (page.index < firstNeededPageIndex || page.index > lastNeededPageIndex) {
// visible N/Ppages *start*
if (index == 1) {
ImageScrollView *Npage = Npage.index +1;
Npage = [[[ImageScrollView alloc] init] autorelease];
[self configurePage:Npage forIndex:index +1];
[pagingScrollView addSubview:Npage];
[visiblePages addObject:Npage];}
if (index < 2 || index > [self pdfPageCount] -2) {
ImageScrollView *Ppage = Ppage.index -1;
ImageScrollView *Npage = Npage.index +1;
Ppage = [[[ImageScrollView alloc] init] autorelease];
[self configurePage:Ppage forIndex:index -1];
[pagingScrollView addSubview:Ppage];
[visiblePages addObject:Ppage];
Npage = [[[ImageScrollView alloc] init] autorelease];
[self configurePage:Npage forIndex:index +1];
[pagingScrollView addSubview:Npage];
[visiblePages addObject:Npage];}
if (index == [self pdfPageCount] -1) {
ImageScrollView *Ppage = Ppage.index -1;
Ppage = [[[ImageScrollView alloc] init] autorelease];
[self configurePage:Ppage forIndex:index -1];
[pagingScrollView addSubview:Ppage];
[visiblePages addObject:Ppage];}
// visible N/Ppages *end*
        [recycledPages addObject:page];
        [page removeFromSuperview];}}
[visiblePages minusSet:recycledPages];
// add missing pages
for (int index = firstNeededPageIndex; index <= lastNeededPageIndex; index++) {
// recycled N/Ppages *start*
if (index == firstNeededPageIndex +1) {
ImageScrollView *Npage = Npage.index +1;
[recycledPages addObject:Npage];
[Npage removeFromSuperview];}
if (index < firstNeededPageIndex +2 || index > lastNeededPageIndex -2) {
ImageScrollView *Ppage = Ppage.index -1;
ImageScrollView *Npage = Npage.index +1;
[recycledPages addObject:Ppage];
[Ppage removeFromSuperview];
[recycledPages addObject:Npage];
[Npage removeFromSuperview];}
if (index == lastNeededPageIndex -1) {
ImageScrollView *Ppage = Ppage.index -1;
[recycledPages addObject:Ppage];
[Ppage removeFromSuperview];}
// recycled N/Ppages *end*
    if (![self isDisplayingPageForIndex:index]) {
        ImageScrollView *page = [self dequeueRecycledPage];
        if (page == nil) {
            page = [[[ImageScrollView alloc] init] autorelease];}
        [self configurePage:page forIndex:index];
        [pagingScrollView addSubview:page];
        [visiblePages addObject:page];}}}

我可以在 NSIndex 中存储 3 个 pdf 页面吗? eg: previousPageToRecycle, previousPage, currentPage, nextPage, nextPageToRecycle

我不确定该怎么做。

【问题讨论】:

    标签: iphone pdf


    【解决方案1】:
    ImageScrollView *Ppage = Ppage.index -1;
    

    Ppage.index -1 是一个整数。您将它分配给 ImageScrollView* 类型的变量,它应该神奇地将它变成一个指针。这可能是一个错误。

    第一段代码可读性更强,看起来似乎在正确的轨道上。

    由于缺乏合理的缩进,第二段代码完全不可读。还有一些问题:

    • 特殊情况太多了。简化你的逻辑;它使您的代码更容易正确和易于维护。
    • 有很多重复的代码。这与特殊情况有关。
    • 我这辈子都想不通为什么 firstNeededPageIndex+1 和 lastNeededPageIndex-1 很特别。
    • 我不会为这么少的页面使用 NSSet。我不认为能够使用 minusSet: 比仅使用 removeObject: 有显着优势(如果您担心性能,请使用 removeObjectIdenticalTo:)

    我不确定您所说的“将页面存储在 NSIndex 中”是什么意思;你是说 CFIndex 还是 NSInteger?


    现在,一个整体的答案:

    一般来说,您在正确的轨道上,但您最多需要加载 五个页:

    • 当前页面,i
    • 第 i-1 和 i+1 页。用户可以随时开始滚动;您不希望在渲染某些图块时显示滞后。
    • 第 i-2 和 i+2 页。有弹性的滚动意味着如果用户从 i 滚动到 i+1,它将显示 i+2 的几个像素。您不想在滚动动画期间加载页面,否则它会出现滞后(除非您可以以某种方式使其加载到后台线程中)。请注意,如果用户从 i 滚动到 i+1 到 i+2,它将在 i+3 处“弹跳”。您可以加载更多,但我认为这种情况并不常见,因此有一点延迟是合理的。

    我使用大小为 8 的类似环形缓冲区的数组实现了这一点;如果页面 i 已加载,则存储在 ring[i%8] 中。因为我一次只需要 5 页,所以 8 就足够了;诚然,您需要正确处理大量环形缓冲区管理代码(通常只需要一段时间来编写代码)。

    我也只是使用了“当前页面”,在滚动期间加载 i±1(希望它们已经加载),在 viewDidAppear: 和滚动结束时加载 i±2 (scrollViewDidEndDragging:willDecelerate: with decelerate=不,还有scrollViewDidEndDecelerating:)。

    您可能还希望将视图保持更长的时间(预加载 i±2,但如果恰好加载了 i±3,则保留 i±3),否则如果用户在滚动期间来回移动,则视图将不必要地重新加载(啦啦啦)。

    如果您显示页码,您可能还需要添加一些滞后。我只在用户滚动 2/3 到下一页时才更改页面(这意味着在两个页面之间切换,用户必须来回移动 1/3 页)。如果你实现了滞后,前一段没什么大不了的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 2018-01-06
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多