Ios 实现带有粘性(水平滚动)标题且具有滚动放大效果的滚动视图的正确方法是什么?
这个问题是一个衍生问题。如果您想下载示例项目,请访问该链接 情景:(尽管这会有所不同) 主滚动视图是屏幕的大小。屏幕的上半部分是UIImageView的水平滚动滚动视图 目标是: 向上滚动(通过向下拖动)超过正常偏移将拉伸imageScroller中的可见图像(在示例中已完成)。向下滚动(通过向上拖动)超过0偏移量将使textView滚动到imagesScroller上方,使imagesScroller看起来是静态的Ios 实现带有粘性(水平滚动)标题且具有滚动放大效果的滚动视图的正确方法是什么?,ios,uiscrollview,Ios,Uiscrollview,这个问题是一个衍生问题。如果您想下载示例项目,请访问该链接 情景:(尽管这会有所不同) 主滚动视图是屏幕的大小。屏幕的上半部分是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.boundsmainScrollView
应该有一个透明的背景([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];