6

我的情况类似于这两个帖子(1907297689684),为了最简洁地描述我的情况,我展示了这个文本/图形布局(类似于你在 IB 中看到的,用于强制缩进级别的点)

UIView(主视图:320x460)
。.UIScrollView(滚动视图:320x460)
。.UIView (OverlayView: 320x40)
。. . .UIButton (ArbitraryButton1)
。. . .UILabel (ArbitraryLabel1)
。. . .UILabel (ArbitraryLabel2)

这里的目标是让 OverlayView 作为一个统一的、透明的容器来定位和显示一些任意的按钮/标签在 ScrollView 的顶部。这些按钮/标签应保持静止,而下方 ScrollView 中的内容会随着用户滑动而移动。按钮/标签有时可能会同时隐藏/取消隐藏/缩放(带有动画),这使得将它们全部分组在单个 OverlayView 中很方便。

问题在于,虽然在 OverlayView 上的点击似乎可以很好地直接传递到底层的 ScrollView,但滑动动作没有任何效果。我可以通过覆盖来检测/拦截滑动

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

OverlayView 中的方法,但是我还没有找到一种方法以使其滚动的方式正确地将它们传递给 ScrollView。显然 touchesMoved 方法不是 UIScrollView 用来检测/解释滑动的方法吗?

我研究过的所有其他类似帖子要么找到了一个在我的情况下不起作用的不同解决方案,要么只是没有解决。我还看到提到使用 touchesShouldBegin / touchesShouldCancel 虽然我不知道如何实现。无论如何,仍然希望社区有一些见解可以让我为此提出一个优雅的解决方案 - 任何示例代码都会很棒。

在此先感谢,乔尔。

PS - 我还应该提到我需要使它与 iOS 3.0 兼容,所以我认为尝试使用 UIGestureRecognizers 已经过时了。

4

4 回答 4

1

这是一个更简单的解决方案,对我来说效果很好:

在 OverlayView(UIScrollView 顶部的视图)中,将宽度和高度都设为 0(这样视图在技术上不再位于滚动视图顶部)并设置 clipsToBounds = NO(这样 OverlayView 的内容仍然显示在滚动视图的顶部)。它对我来说就像一个魅力。

 self.OverlayView.clipsToBounds = NO;
 CGRect frame = self.OverlayView.frame;
 self.OverlayView.frame = CGRectMake(frame.origin.x, frame.origin.y, 0, 0);

请注意,如果 OverlayView 包含交互式控件(如上面的按钮),那么它们将不再起作用。您需要将其移动到 UIScrollView 上方的自己的视图中。

于 2013-07-15T17:13:38.360 回答
0

您应该继承 UIScrollView 并覆盖 touchesShouldCancelInContentView: 方法

-(BOOL)touchesShouldCancelInContentView:(UIView *)view
{

    if ([view isKindOfClass:[UIButton class]]) {//or whatever class you want to be able to scroll in
        return YES;
    }

    if ([view isKindOfClass:[UIControl class]]) {
        return NO;
    }

    return YES;
}
于 2013-01-10T18:19:35.303 回答
0

怎么样,在 viewDidLoad 运行时,您将按钮从容器视图中取出,并将它们作为子视图直接放置在视图中(并摆脱容器视图)?然后没有容器视图来拦截滑动,但您仍然可以使用视图对 IB 中的内容进行分组。

您也可以将容器视图作为滚动视图的子视图放入,并且在滚动视图委托中,只要用户滚动,就会不断重新定位视图。这似乎很有可能让人紧张,但可能值得一试。

此外,如果包含视图是一个可视化容器并且您需要查看它,则可以改为使用放置在 CALayer 顶部的超级视图中的 CALayer 来呈现滚动视图,因为 CALayer 与输入无关并且不会每次接触。

于 2011-03-13T05:36:41.603 回答
0

我需要类似的东西,经过一些研究和阅读 Apple 的文档后,我创建了这个非常简单且安全的开源库,可以解决您的 (MobileJoel) 问题。演示项目使用滚动视图,因此它直接相关:
https ://github.com/natrosoft/NATouchThroughView

因此,您的视图层次结构将如下所示:

UIView (MainView: 320x460)    
. .UIScrollView (ScrollView: 320x460)
. .UIView (OverlayView: 320x40)  --> change this view to class NARootTouchThroughView in I.B.
. . . .UIView (transparent UIView that you change to class NATouchThroughView in I.B.)
. . . .UIButton (ArbitraryButton1)
. . . .UILabel (ArbitraryLabel1)
. . . .UILabel (ArbitraryLabel2)

所以基本上你的覆盖视图将在它下面转发它的触摸,然后被 UIScrollview 接收。如果您的 UILabel 很大并且正在拦截触摸,则将另一个 NATouchThroughView 放在它们之上,以便最终结果如下所示:

UIView (MainView: 320x460)    
. .UIScrollView (ScrollView: 320x460)
. .NARootTouchThroughView (OverlayView: 320x40)
. . . .NATouchThroughView (transparent)
. . . .UIButton (ArbitraryButton1)
. . . .UILabel (ArbitraryLabel1)
. . . .UILabel (ArbitraryLabel2)
. . . .NATouchThroughView (transparent and covers the labels but not the UIButton)
于 2013-10-22T12:02:50.207 回答