【问题标题】:UIScrollView - how is showsHorizontalScrollIndicator calculated?UIScrollView - showsHorizo​​ntalScrollIndicator 是如何计算的?
【发布时间】:2026-02-15 04:50:02
【问题描述】:

如果启用showsHorizontalScrollIndicator,UIScrollView 底部会显示一个小的水平指示器。我想知道是否有人可以告诉我这是如何计算的。原因是,如果有内容左/右,我想在水平导航系统中显示自定义指示器,当内容可用时显示/隐藏。

【问题讨论】:

    标签: ios uiscrollview


    【解决方案1】:

    我只使用scrollView.contentOffset.x。如果你想知道你在哪一页,你除以你的页面宽度(假设你有一个标准宽度)。所以 int currentPage=(int)scrollView.contentOffset.x/SCREEN_WIDTH; 例如。现在如果你想显示一个位置指示器,比如在 iOS 主页中,你可以在 -(void)scrollViewDidScroll:(UIScrollView *)sender 类似

    currentPage=(int)scrollView.contentOffset.x/SCREEN_WIDTH;
    for(int i=0; i<pageCount; i++){
      if(i==currentPage)//display a filled in 'o'
      else //display an empty 'o'
    }
    

    哦,顺便说一句,-(void)scrollViewDidScroll:(UIScrollView *)sender 在最初加载 UIScrollView 时不会被调用,所以您或许应该自己调用它(以便在用户滚动之前显示指示器)。当然,您也可以使用scrollView.contentOffset.y,因此您可以轻松地调整它以显示“o”的“+”形排列,同时暗示上方和下方的内容。

    【讨论】:

    • 在 Oh Danny Boy 的代码中,我不明白他为什么要使用 performSelector:withObject:afterDelay——尤其是当他的延迟为 0 时。当然更好的是 [self scrollViewReachedRightBound];等
    • 你是绝对正确的。我一直在玩延迟值递减直到我达到 0。我编辑了我的帖子以反映变化。感谢您指出这一点并花时间回答。
    • 谢谢“哦,丹尼男孩”。我还认为您可能会丢失 'scrollViewReachedLeftBound' 和 'scrollViewReachedRightBound' 方法并用它们的 2 行代码替换它们。我一直在研究我的 iOS 之类的位置指示器。
    【解决方案2】:

    我使用了以下解决方案。不是最漂亮的,但它似乎工作。需要UIScrollViewDelegate

    -(void)scrollViewDidScroll:(UIScrollView *)sender 
    {   
        [NSObject cancelPreviousPerformRequestsWithTarget:self];
        [self scrollViewDidEndScrollingAnimation:subNavigation];
    }
    
    -(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
    {
        [NSObject cancelPreviousPerformRequestsWithTarget:self];
    
        if (scrollView.contentOffset.x <= 0) {
            [self scrollViewReachedLeftBound]; 
        } else if (scrollView.contentOffset.x >= 300) {
            [self scrollViewReachedRightBound]; 
        } else {
            [leftArrow setHidden:NO];
            [rightArrow setHidden:NO];
        }
    }
    
    - (void)scrollViewReachedLeftBound
    {
        [leftArrow setHidden:YES];
        [rightArrow setHidden:NO];
    }
    
    - (void)scrollViewReachedRightBound
    {
        [leftArrow setHidden:NO];
        [rightArrow setHidden:YES];
    }
    

    【讨论】: