在UIScrollView滚动时使静态UIView变粘

时间:2015-09-30 16:44:39

标签: ios objective-c uiscrollview

  • 我有一个比设备高度长得多的滚动视图(图表:单词)
  • 滚动视图的底部是一些底部内容(图表:法式印刷机),背景颜色不同。
  • 为了将底层内容与单词分开,我创建了1pt高UIView作为边框(图表:红线)
  • 我有一个位于设备底部的按钮,位于滚动视图之外(滚动视图为device.height - button.height)。此按钮的背景颜色与底部内容的背景颜色相匹配。

不同的背景颜色看起来很不明显,没有将底部按钮与内容视图分开,所以虽然底部内容不可见,但我希望边框是粘性的,并且看起来位于底部上方按钮(图表:红线)。

一个小注释:我在IB中使用AutoLayout,但我为边界约束创建了一个IBOutlet,我可以在代码中轻松操作。

enter image description here

4 个答案:

答案 0 :(得分:3)

这是一个完成这项工作的lib: https://github.com/ericcastro/ECStretchableHeaderView

(它与示例中的UItableView一起使用,但实现基于UIScrollview)

您必须通过更改逻辑来更新代码: 这里的视图位于顶部,但整个原则就在那里!

答案 1 :(得分:1)

您可以创建两个边框。 第一个是滚动视图中底部内容顶部的动态边框。 第二个是滚动视图外部按钮顶部的粘性边框。

第一个边框可见时,应隐藏第二个边框。为此,您应该注册if (Input.GetAxis("WalkButton") > .5f) { // code goes here to make character run right } else if (Input.GetAxis("WalkButton") > 0f) { // code goes here to make character walk right } 。实施方法UIScrollViewDelegate。只需检查第一个边框是否高于第二个边框。这可以通过以下方式完成:

scrollViewDidScroll(_:)

这对您来说可能不是100%正确,因为不清楚您的if firstBorder.frame.origin.y < scrollView.contentOffset.y + scrollView.frame.height { // firstBorder is on the screen, hide the secondBorder... secondBorder.hidden = true } else { secondBorder.hidden = false } 是否在按钮上方或是否重叠。如果边框隐藏得太早或太晚,请调整它。

如果您的按钮是透明的,您还应隐藏第一个边框(如果未显示),因为它可能位于按钮下方。然后,只需将代码UIScrollViewfirstBorder.hidden = false添加到代码中。

答案 2 :(得分:0)

我会采取以下步骤:

  1. 将按钮放在scrollView
  2. 之外的视图中
  3. 将令人敬畏的底部内容(我认为是Bender头部的图片)放在按钮所在的同一视图中,并将其限制在顶部,左侧和右侧边缘。
  4. 将滚动视图的内容插入的底部尺寸设置为等于令人敬畏的底部内容视图的高度。这将告诉滚动视图,可以向下滚动可滚动内容实际末端下方的许多像素。
  5. UIScrollViewDelegate添加到滚动视图中,该视图至少实现scrollViewDidScroll(_)。在此方法中,检查滚动内容的最底部位置。如果该位置落在您在步骤#3中设置的底部内容插入的某处,则拉伸或以其他方式垂直重新定位您的真棒底部内容相同的数量。
  6. 如果我有时间,我会掀起一个做这件事的样本。

答案 3 :(得分:0)

首先我想到了至少两个简单的解决方案。

关键是找到交叉点

滚动视图中的红线从按钮下方出来或进入按钮下方的内容大小值。

选项1: 在内容大小值接近交叉点时,在按钮顶部添加另一条红线并在scrollViewDidScroll中隐藏/显示(隐藏属性)

选项2: 内容大小值是否接近交叉点移除约束并将红线的超视图从scrollview更改为按钮或相反。重新添加特定superview的约束。显然你需要在代码中这样做。