2012-09-11 188 views
0

我正在研究一个简单的PDF阅读器,底部我有一个UIScrollView所有的页面,中间有一个标签,它应该在滚动时显示页码。计算UIScrollView的位置

但我不知道如何计算确切的位置,看看哪些页面在中间。 我也有2种类型的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]; 
} 

正如你从图片中看到的那样,页面并不真正匹配(他们意外地在第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; 
    } 
} 
1

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

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

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

0

我认为这将是更容易使用hitTest::得到中央的子视图,真正的问题是划分空间,但如果你把它作为网页预览的一部分,它可能被处理。

+0

这意味着每次我滚动时,我都必须对所有缩略图做一次触击测试吗? –

+0

不,你确实在一行代码的scrollview的中心点进行测试。但是缩略图之间的空格必须是它们的一部分,否则当分隔空间居中时,您将无法获得缩略图。 –

+0

是的,但是我不必为每个缩略图匹配那个点吗? –