0

请原谅我这个迟钝的标题,因为我不确定如何描述这个问题。

最近,许多 iOS 应用程序使用滚动 UI 设计模式,这有助于最大化屏幕空间,通常在用户向下滚动时隐藏标题。

例如,Instragram 的主视图顶部有 Instragram 标题。在此视图上向上滚动会使标题固定在顶部,并且视图通常会弹回内容的顶部。但是向下滚动,标题作为内容的一部分,为额外的 44 点垂直空间让路。

可能我有一段时间没有做太多 iOS 工作了,但我无法轻易弄清楚如何最好地实现这一点?为可怕的描述道歉。

4

2 回答 2

1

如果无论如何标题都保持不变,请在滚动视图顶部使用单独的视图。如果您使用 UITableView,则可以使用节标题。

编辑使用此代码:

- (void)scrollViewDidScroll:(UIScrollView*) scrollView
{
    CGPoint offset = scrollView.contentOffset;

    CGRect headerFrame = _headerView.frame;

    if(offset.y > 0){
        headerFrame.origin.y = offset.y;
    }
    else{
        headerFrame.origin.y = 0.0;
    }

    [_headerView setFrame:headerFrame];
}

(假设 _headerView 是您的标题,位于滚动视图的顶部,而不是其中。此外,滚动视图和标题都从其父视图的顶部开始,y==0。此外,您的视图控制器必须设置为滚动视图的代表

我只是从内存中编写了这段代码;尚未对其进行测试,但最多只需要调整即可。

于 2012-07-10T11:59:42.127 回答
1

我在上面尝试了ranReloaded的答案,但似乎调用setFrame:UIScrollView 会阻止视图在超出其范围时弹跳。

相反,我将滚动视图设置为适合另一个名为scrollerWrapper. 将计算出的原点和高度应用于此视图会给我带来我想要的效果,并保留反弹行为。

- (void)scrollViewDidScroll:(UIScrollView*) scrollView
{
    CGPoint offset = scrollView.contentOffset;

    CGRect headerFrame = header.frame;
    CGRect wrapperFrame = scrollerWrapper.frame;

    if(offset.y > 0){
        headerFrame.origin.y = -offset.y;
        wrapperFrame.origin.y = MAX(0, headerFrame.size.height - offset.y);
        }
    else{
        headerFrame.origin.y = 0.0;
        wrapperFrame.origin.y = headerFrame.size.height;
        }
   wrapperFrame.size.height = self.view.frame.size.height - wrapperFrame.origin.y;

    [header setFrame:headerFrame];
    [scrollerWrapper setFrame:wrapperFrame];
}
于 2012-07-10T16:27:00.230 回答