我的情况类似于这两篇文章(1907297和689684),为了最简洁地描述我的情况,我介绍了这种文本/图形布局(类似于您在IB中看到的,用于强制缩进级别的点)
UIView(MainView:320x460)
。 .UIScrollView(ScrollView:320x460)
。 .UIView(OverlayView:320x40)
。 。 。 .UIButton(ArbitraryButton1)
。 。 。 .UILabel(ArbitraryLabel1)
。 。 。 .UILabel(ArbitraryLabel2)
这里的目标是使OverlayView用作一个统一的透明容器,以在ScrollView的顶部定位和显示一些任意按钮/标签。当用户滑动下方的ScrollView中的内容时,这些按钮/标签应保持静止。按钮/标签有时可能会被同时隐藏/取消隐藏/缩放(带有动画),这使得将它们全部分组在单个OverlayView中非常方便。
问题是,虽然OverlayView上的拍击似乎很好地传递到了基础ScrollView,但是滑动 Action 没有效果。我可以通过覆盖
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
方法在OverlayView中,但是我还没有找到一种方法来正确地将这些方法传递给ScrollView并使它滚动。显然touchesMoved方法不是UIScrollView用于检测/解释滑动的方法吗?
我研究过的所有其他类似帖子都找到了对我而言不起作用的其他解决方案,或者只是未解决。我也看到过提到使用touchesShouldBegin/touchesShouldCancel的提法,尽管我不知道如何实现。无论如何,仍然希望社区中的一些见解可以使我为此提出一个优雅的解决方案-任何示例代码都很棒。
预先感谢,乔尔。
P.S. -我还应该提到我需要使它与iOS 3.0兼容,因此我认为尝试使用UIGestureRecognizers已告一段落。
最佳答案
这是一个更简单的解决方案,对我来说很有效:
在OverlayView(位于UIScrollView顶部的 View )中,将width和height都设置为0(以使该 View 不再在滚动 View 的顶部),并设置clipsToBounds = NO(以使OverlayView的内容仍显示出来)在滚动 View 的顶部)。对我来说,它就像是一种魅力。
self.OverlayView.clipsToBounds = NO;
CGRect frame = self.OverlayView.frame;
self.OverlayView.frame = CGRectMake(frame.origin.x, frame.origin.y, 0, 0);
请注意,如果OverlayView包含交互式控件(如上面的按钮),则它们将不再起作用。您需要将其移到UIScrollView上方的自己的 View 中。