这个问题是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偏移更清晰。
答案 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.bounds
。 mainScrollView
应该具有透明背景([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的canCancelContentTouches
或delaysContentTouches
中至少有一个设置为YES。
对于更精细的控制,您可以在两个scrollView上进行透明手势视图覆盖,并将scrollView的panGestureRecognizers附加到手势视图。请注意这一点 - 附加gestureRecognizers的顺序将反映在截取手势的顺序中。
有关劫持scrollview的panGestureRecognizer的更多细节,非常值得观看WWDC 2012中的“使用滚动视图增强用户体验”,尤其是下半部分,其中scrollView用于控制兄弟的openGL视图。
关于在向下拖动时拉伸图像,可以通过mainScrollView上的scrollViewDidScroll
委托方法有效地完成 - 在contentOffset.y为负数时对imageView应用变换。