请原谅我这个迟钝的标题,因为我不确定如何描述这个问题。
最近,许多 iOS 应用程序使用滚动 UI 设计模式,这有助于最大化屏幕空间,通常在用户向下滚动时隐藏标题。
例如,Instragram 的主视图顶部有 Instragram 标题。在此视图上向上滚动会使标题固定在顶部,并且视图通常会弹回内容的顶部。但是向下滚动,标题作为内容的一部分,为额外的 44 点垂直空间让路。
可能我有一段时间没有做太多 iOS 工作了,但我无法轻易弄清楚如何最好地实现这一点?为可怕的描述道歉。
如果无论如何标题都保持不变,请在滚动视图顶部使用单独的视图。如果您使用 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。此外,您的视图控制器必须设置为滚动视图的代表)
我只是从内存中编写了这段代码;尚未对其进行测试,但最多只需要调整即可。
我在上面尝试了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];
}