我正在使用一个简单的PDF阅读器,在底部我有一个UIScrollView
包含所有页面,在中间我有一个标签,应该在滚动时显示页码。< / p>
但我无法弄清楚如何计算确切位置并查看中间的页面。 我还有两种类型的PDF,一种是双页PDF,另一种只是单面。
这是我在scrollview中绘制它们的方式
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
时我找不到任何关于如何计算哪个页面在视图中间的好方法,目前我试过这个:< / p>
- (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];
}
从图片中可以看出,这些页面并不真正匹配(它们在第二张图片中意外地进行了对比,但是当你进一步滚动时它们没有) 有没有人有这样的经历?
答案 0 :(得分:1)
我认为您需要计算单个页面的大小并将scrollView.contentSize.width除以。
CGFloat sizeOfAThumbnailPage =((spaceLeftOfThumbnailPage / 2.0f)+ sizeOfThumbnailPage +(spaceRightOfThumbnailPage / 2.0f));
NSInteger pageNearestMiddle = (NSInteger)(roundfscrollView.contentSize.width / sizeOfAThumbnailPage));
答案 1 :(得分:0)
我认为使用hitTest::将子视图放在中心会更容易,真正的问题是划分空间,但如果将其作为页面预览的一部分,则可以处理。
答案 2 :(得分: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;
}
}