使用具有滚动放大效果的粘性(水平滚动)标题实现滚动视图的正确方法是什么?

时间:2013-12-31 16:47:33

标签: ios uiscrollview

这个问题是Sticky scrollview subview has incorrect frame after scrolling fast. Compilable example的副产品。如果您想下载示例项目,请访问该链接。

情景:(虽然这会有所不同)

ViewController
.    View
.    .    MainScrollview
.    .    .     ImageScroller
.    .    .     .     ImageView(s)
.    .    .     TextView (Inside container view)

主滚动视图是屏幕的大小。屏幕的上半部分是UIImageViews的水平滚动滚动视图。

目标: 向上滚动(通过向下拖动)超过正常偏移将拉伸imageScroller中的可见图像(这在示例中完成)。向下滚动(通过向上拖动)过去0偏移将使imageView滚动在imagesScroller上方,使imagesScroller看起来是静态的。

我的实施将起作用(在链接问题中给出答案),但显然不是最佳的。我已经尝试重新排列mainScrollview后面的imageScroller,所以它实际上是静态的,但是这需要在mainScroller上创建一个透明视图,imageScroller的大小将把触摸事件传递给imageScroller。对我来说,这并不比在上述方案中不断计算imageScroller的正确Y偏移更清晰。

1 个答案:

答案 0 :(得分:1)

我建议你应该通过稍微改变一下来做到这一点。

1 - 重新排列视图层次结构

     self.view ---+
                  |
                  +---> self.mainScrollView
                  |
                  +---> self.imageScrollView

以你的条件......

    ViewController
    .    View
    .    .    MainScrollview
    .    .    .     TextView (Inside container view)
    .    .    ImageScroller
    .    .    .    ImageView(s)

您的imageScrollView是mainScrollView的兄弟,而不是孩子。

self.mainScrollView是最重要的视图,完全涵盖imageScrollView。在这两种情况下,它们的帧都是self.view.boundsmainScrollView应该具有透明背景([UIColor clearColor]),以便您可以在其后面看到imageScrollView。 mainScrollView的textView将其原点设置为self.view.bounds.size.height,这样在您开始向下滚动之前就看不到它。

2 - 管理您的手势

由于mainScrollView位于最高位置,因此PanGestureRecognizer将捕获所有触摸,并且不会将任何内容转发到imageScrollView。您需要解决此问题,以便您可以滚动图像。

要管理手势协商,您可以将这两种手势附加到单个视图中。最简单的实现是将imageScrollView的panGestureRecognizer附加到mainScrollView:

    UIGestureRecognizer* panGR = self.imageScroller.panGestureRecognizer;
    [self.mainScrollView addGestureRecognizer:panGR];

imageScrollview.panGestureRecognizer现在将识别mainScrollView上的手势,并将继续将生成的消息传递给它的imageScrollView。

这可能就是你需要做的。在我的测试实现中,这是足够的,只要mainViewController的canCancelContentTouchesdelaysContentTouches中至少有一个设置为YES。

对于更精细的控制,您可以在两个scrollView上进行透明手势视图覆盖,并将scrollView的panGestureRecognizers附加到手势视图。请注意这一点 - 附加gestureRecognizers的顺序将反映在截取手势的顺序中。

有关劫持scrollview的panGestureRecognizer的更多细节,非常值得观看WWDC 2012中的“使用滚动视图增强用户体验”,尤其是下半部分,其中scrollView用于控制兄弟的openGL视图。

关于在向下拖动时拉伸图像,可以通过mainScrollView上的scrollViewDidScroll委托方法有效地完成 - 在contentOffset.y为负数时对imageView应用变换。