计算UIScrollView的位置

问题描述 投票:0回答:3

我正在开发一个简单的 PDF 阅读器,在底部我有一个包含所有页面的

UIScrollView
,在中间我有一个标签,当您滚动时应该显示页码。

但我不知道如何计算确切的位置并查看中间是什么页面。 我还有两种类型的 PDF,一种是双页 PDF,另一种只是单面。

这就是我在滚动视图中绘制它们的方式

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];
}

这给了我这些漂亮的缩略图: enter image description here enter image description here

但是我被困在下一部分,当滚动通过

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];
}

正如您从图片中看到的,页面并不真正匹配(它们在第二张图片中意外匹配,但当您进一步滚动时它们不匹配) 有人有这样的经历吗?

ios iphone pagination uiscrollview
3个回答
1
投票

我认为你需要计算单个页面的大小并将scrollView.contentSize.width除以该大小。

CGFloat尺寸AThumbnailPage = ((spaceLeftOfThumbnailPage / 2.0f) + 缩略图页面大小 +(缩略图页面右侧空间 / 2.0f));

NSInteger pageNearestMiddle = (NSInteger)(roundfscrollView.contentSize.width / 缩略图页大小));


0
投票

我认为使用 hitTest:: 将子视图置于中心会更容易,真正的问题是划分空间,但如果将其作为页面预览的一部分,则可能会得到解决。


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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.