【问题标题】:Calculate position of UIScrollView计算 UIScrollView 的位置
【发布时间】:2012-09-11 07:54:01
【问题描述】:

我正在开发一个简单的 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];
}

这给了我这些漂亮的缩略图:

但我被困在下一部分,当滚动通过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];
}

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

【问题讨论】:

    标签: iphone ios uiscrollview paging


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这意味着每次滚动时,我都必须对所有缩略图进行一次命中测试,对吗?
      • 不,您在滚动视图的中心点执行 hitTest,这是一行代码。但是缩略图之间的空格必须是它们的一部分,否则当分隔空间居中时,您将无法获得缩略图。
      • 是的,但我不是必须将每个缩略图都匹配到那个点吗?
      • 不,作为对滚动视图的单个方法调用的结果,您将获得居中的缩略图:[scrollview hitTest:centerPoint withEvent:nil] 应该返回一个居中的缩略图。这不是你需要的吗?
      • 啊哈,让我试试看,我想我必须浏览每个缩略图,看看它是否触及中心点
      【解决方案3】:

      为了解决这个问题,我终于找到了一个不错的解决方案。

      创建缩略图时,我将所有位置保存在一个数组中,滚动时我只是检查位置是否匹配。

      我知道这并不理想,但是动态计算位置有点困难,因为我有不同大小的缩略图。

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

      【讨论】:

        猜你喜欢
        • 2011-04-21
        • 2012-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-07
        • 2016-10-13
        相关资源
        最近更新 更多