0

私は単純な PDF リーダーに取り組んでいます。一番下にはUIScrollViewすべてのページがあり、真ん中にはスクロール中にページ番号を表示するラベルがあります。

しかし、正確な位置を計算して、どのページが真ん中にあるかを確認する方法がわかりません。また、2 種類の PDF があります。1 つは見開きページの PDF で、もう 1 つは片面だけです。

これは、スクロールビューでそれらを描画する方法です

NSInteger xPos = 20;
for(int i = 0; i < [pdf numberOfPages]; i++)
{
    ThumbViewController *tmpThumb = [[ThumbViewController alloc] initWithNibName:nil bundle:nil page:[NSString stringWithFormat:@"%i", i + 1] andPDF:pdf];

    // SINGLE SIDE PDF
    if([_issue.presentation isEqualToString:@"1"])
    {
        tmpThumb.view.frame = CGRectMake(xPos, 5, 150, 200);

        xPos += 200;
    }
    // DOUBLE SIDE PDF
    else
    {
        tmpThumb.view.frame = CGRectMake(xPos, 5, 150, 200);

        // Draw double pages
        if((i % 2) == 1)
        {
            xPos += 105;
        }
        else
        {
            xPos += 140;
        }
    }

    [_scrollView addSubview:tmpThumb.view];

    [tmpThumb release];
}

これらの素敵なサムネイルが表示されます。 ここに画像の説明を入力 ここに画像の説明を入力

しかし、私は次の部分で立ち往生しています。スクロールするUIScrollViewと、ビューの真ん中にあるページを計算する方法について良い方法が見つかりません。現在、これを試しました:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    // Calculate what page is in the middle
    NSInteger contentSize = scrollView.contentSize.width / [_readerModel.pdf numberOfPages];
    NSInteger pageNumber = floor(scrollView.contentOffset.x / contentSize);

    // Single side
    if([_issue.presentation isEqualToString:@"1"]) pageNumber = floor(scrollView.contentOffset.x / contentSize);

    NSLog(@"%d / %d", contentSize, pageNumber);

    _thumbnailPopup.titleLabel.text = [_readerModel getTitleForPage:pageNumber inIssue:_readerModel.currentIssue];
    _thumbnailPopup.pageLabel.text = [NSString stringWithFormat:@"%d", pageNumber];
}

写真からわかるように、ページは実際には一致していません (2 番目の写真では偶然一致していますが、さらにスクロールすると一致しません)。

4

3 に答える 3

1

1 ページのサイズを計算し、それで scrollView.contentSize.width を割る必要があると思います。

CGFloat sizeOfAThumbnailPage = (((spaceLeftOfThumbnailPage / 2.0f) + sizeOfThumbnailPage +(spaceRightOfThumbnailPage / 2.0f));

NSInteger pageNearestMiddle = (NSInteger)(roundfscrollView.contentSize.width / sizeOfAThumbnailPage));

于 2012-09-11T08:03:10.000 に答える
0

サブビューを中央に表示するには、 hitTest::を使用する方が簡単だと思います。実際の問題はスペースを分割することですが、ページ プレビューの一部として使用すると処理される可能性があります。

于 2012-09-11T08:05:14.857 に答える
0

これに戻るために、ようやくまともな解決策を見つけました。

サムネイルを作成するときは、すべての位置を配列に保存しました。スクロールするときは、位置が一致するかどうかを確認するだけです。

これが理想的ではないことはわかっていますが、サムネイルのサイズが異なるため、オンザフライで位置を計算するのは少し大変でした。

NSInteger scrollPos = scrollView.contentOffset.x + (scrollView.frame.size.width / 2);

for(NSDictionary *tmpDic in _thumbsPos) {
    NSInteger startPos = [[tmpDic objectForKey:@"start"] intValue];
    NSInteger endPos = [[tmpDic objectForKey:@"end"] intValue];
    NSInteger page = [[tmpDic objectForKey:@"page"] intValue];

    if(scrollPos >= startPos && scrollPos <= endPos) {
        _thumbnailPopup.titleLabel.text = [_readerModel getTitleForPage:page inIssue:_readerModel.currentIssue];
        _thumbnailPopup.pageLabel.text = [NSString stringWithFormat:@"%d", (page + 1)];

        return;
    }
}
于 2012-09-18T10:37:04.690 に答える