如何锚定 UIScrollView 的子视图,如移动 Safari 中的 URL 栏?

Posted

技术标签:

【中文标题】如何锚定 UIScrollView 的子视图,如移动 Safari 中的 URL 栏?【英文标题】:How do i anchor subviews of a UIScrollView like the URL bar in mobile safari? 【发布时间】:2009-12-03 19:59:59 【问题描述】:

我想做一些类似于移动 safari 在页面加载时将其 URL 栏固定在屏幕顶部的方法,除非您滚动到顶部,在这种情况下,它会随着其余内容一起向下滚动。

然而,我希望相反的事情发生;如果我向下滚动,我希望特定的子视图滚动到屏幕外,但如果我滚动到顶部,我希望子视图保持锚定在屏幕顶部,而其余内容继续向下滚动。我想我可以对视图层次结构做一些诡计,当我们滚动到顶部时,子视图会更改它们的超级视图,但我想知道是否还有其他更优雅的解决方案。

【问题讨论】:

【参考方案1】:

对我自己的问题的回答很晚,但我想我会透露我是如何做到这一点的。

我继承了 UIScrollView 并实现了 layoutSubviews 方法,每次滚动位置发生变化时都会调用该方法。在这里,您需要做的就是确定要锚定的视图并执行以下操作:

- (void) layoutSubviews 
  [super layoutSubviews];

  CGFloat x = 0.0f;
  CGFloat y = MIN(self.contentOffset.y,0.0f);

  anchorview.frame = CGRectMake(x,y,anchorview.frame.size.width,anchorview.frame.size.height);

如果您希望锚定视图在滚动超过顶部时保持在顶部(而不是保持在相对于滚动视图的相同位置),那么这将做到这一点,因为内容偏移的 y 坐标会更小当您滚动超出视图的最顶部时,该值大于零。

【讨论】:

【参考方案2】:

UITableView 部分标题已经在普通表中执行此操作,您可以利用该行为。

【讨论】:

那些行为与我想要的相反;我希望视图在我滚动到顶部并滚动内容时自行锚定,而不是相反,因为表视图标题在普通表中工作;我也希望它适用于任何一种表格视图。

以上是关于如何锚定 UIScrollView 的子视图,如移动 Safari 中的 URL 栏?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XIB 的子视图实现 UIScrollView

UIScrollView 的子视图应该如何报告它们的 contentSize 范围?

UIViews 是 UIScrollView 的子视图。如何跟踪子视图在定义的矩形内?

UIScrollView 如何将充当容器的子视图约束到所有其他视图?

如何在 Swift 的 UIScrollView 中的视图之间添加填充? [关闭]

固定 UIScrollView 的子视图,而其他子视图可滚动