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

Ios 实现带有粘性(水平滚动)标题且具有滚动放大效果的滚动视图的正确方法是什么?,ios,uiscrollview,Ios,Uiscrollview,这个问题是一个衍生问题。如果您想下载示例项目,请访问该链接 情景:(尽管这会有所不同) 主滚动视图是屏幕的大小。屏幕的上半部分是UIImageView的水平滚动滚动视图 目标是: 向上滚动(通过向下拖动)超过正常偏移将拉伸imageScroller中的可见图像(在示例中已完成)。向下滚动(通过向上拖动)超过0偏移量将使textView滚动到imagesScroller上方,使imagesScroller看起来是静态的 我的实现将起作用(在相关问题中给出答案),但显然不是最佳的。我尝试重新排列主滚

这个问题是一个衍生问题。如果您想下载示例项目,请访问该链接

情景:(尽管这会有所不同)

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

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


我的实现将起作用(在相关问题中给出答案),但显然不是最佳的。我尝试重新排列主滚动视图后面的imageScroller,使其实际上是静态的,但这需要在主滚动视图上创建一个与imageScroller大小相同的透明视图,以便将触摸事件传递给imageScroller。对我来说,这并不比在上述方案中不断计算imageScroller的正确Y偏移更干净

我建议你通过改变一些事情来做到这一点

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

     self.view ---+
                  |
                  +---> self.mainScrollView
                  |
                  +---> self.imageScrollView
用你的话来说

    ViewController
    .    View
    .    .    MainScrollview
    .    .    .     TextView (Inside container view)
    .    .    ImageScroller
    .    .    .    ImageView(s)
您的imageScrollView是mainScrollView的同级,而不是子级

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

2-管理您的手势

由于mainScrollView是最重要的,它的PangestureRecognitor将捕获您的所有触摸,并且不会将任何内容转发到imageScrollView。您需要修复此问题,以便可以滚动图像

要管理手势协商,可以将这两个手势附加到单个视图上。最简单的实现是将imageScrollView的PangestureRecognitor连接到主ScrollView:

    UIGestureRecognizer* panGR = self.imageScroller.panGestureRecognizer;
    [self.mainScrollView addGestureRecognizer:panGR];
imageScrollview.PangestureRecognitor
现在将识别主ScrollView上的手势,并将继续将生成的消息传递到其imageScrollview

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

为了实现更细粒度的控制,您可以在两个scrollView上叠加一个透明的手势视图,并将两个scrollView的PangestureRecognitors附加到手势视图。注意这一点-附加手势识别器的顺序将反映在截取手势的顺序中

有关劫持scrollview的PangestureRecognitor的更多详细信息,请观看WWDC 2012中的“增强滚动视图的用户体验”,特别是下半部分,其中scrollview用于控制兄弟openGL视图


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

。非常感谢。下班后我会试试的。我真正的实现需要textview在开始时仍然可见,并且图像不能全屏显示,但这一想法非常正确。@用户,textview可以在任何地方,只要调整它的origin.y值即可。如果图像不是全屏的,您可能需要改进此解决方案,因为imageScrollView的PangestureRecognitor将从mainScrollView边界中的任何位置启动。
    UIGestureRecognizer* panGR = self.imageScroller.panGestureRecognizer;
    [self.mainScrollView addGestureRecognizer:panGR];