gpt4 book ai didi

ios - 实现带有粘性(水平滚动)标题并具有滚动放大效果的 ScrollView 的正确方法是什么?

转载 作者:行者123 更新时间:2023-11-29 03:22:52 27 4
gpt4 key购买 nike

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

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

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

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

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

我的实现会起作用(在链接的问题中给出了答案)但它显然不是最佳的。我试图重新排列 mainScrollview 后面的 imageScroller,因此它实际上是静态的,但这需要在 mainScroller 上制作一个透明 View ,其大小与 imageScroller 的大小相同,它将触摸事件传递给 imageScroller。对我来说,这并不比在上述方案中不断计算 imageScroller 的正确 Y 偏移更干净。

最佳答案

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

1 - 重新排列您的 View 层次结构

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

用你的话说...

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

您的 imageScrollView 是 mainScrollView 的兄弟,而不是 child 。

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

2 - 管理你的手势

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

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

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

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

这可能就是您需要做的全部。在我的测试实现中,这就足够了,只要至少将 mainViewController 的 canCancelContentTouchesdelaysContentTouches 之一设置为 YES。

要获得更细粒度的控制,您可以在两个 ScrollView 上叠加一个透明的手势 View ,并将两个 ScrollView 的 panGestureRecognizers 附加到手势 View 。请注意这一点 - 您附加 gestureRecognizers 的顺序将反射(reflect)在拦截手势的顺序中。

有关劫持 scrollview 的 panGestureRecognizer 的更多详细信息,非常值得一看 WWDC 2012 的“使用 ScrollView 增强用户体验”,尤其是下半部分,其中使用 scrollView 来控制兄弟 openGL View 。

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

关于ios - 实现带有粘性(水平滚动)标题并具有滚动放大效果的 ScrollView 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20860545/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com