我的情况类似于这两个帖子(1907297和689684)并且最简洁地描述我的情况,我提出了这个文本/图形布局(类似于你在IB中看到的情况) ,用于强制缩进级别的点)
UIView(MainView:320x460)
。 .UIScrollView(ScrollView: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虽然我不知道如何实现。无论如何,仍然希望社区有一些洞察力可以让我为此提出一个优雅的解决方案 - 任何示例代码都会很棒。
提前致谢,乔尔。
P.S。 - 我还应该提一下,我需要将其与iOS 3.0兼容,所以我认为尝试使用UIGestureRecognizers已经出局了。
答案 0 :(得分:1)
这是一个更适合我的简单解决方案:
在OverlayView(UIScrollView顶部的视图)中,使宽度和高度均为0(以便视图不再在技术上位于scrollview之上)并设置clipsToBounds = NO(以便OverlayView的内容)仍然出现在scrollview的顶部)。它对我来说就像一个魅力。
self.OverlayView.clipsToBounds = NO;
CGRect frame = self.OverlayView.frame;
self.OverlayView.frame = CGRectMake(frame.origin.x, frame.origin.y, 0, 0);
请注意,如果OverlayView包含交互式控件(如上面的按钮),则它们将不再起作用。您需要将其移动到UIScrollView上方的自己的视图中。
答案 1 :(得分:0)
在viewDidLoad的运行时,如何从容器视图中取出按钮并将它们作为子视图直接放在视图中(并摆脱容器视图)?然后没有容器视图来拦截滑动,但你仍然可以使用视图来分组IB中的东西。
您也可以将容器视图作为滚动视图的子视图放入,并且在滚动视图中,委托会在用户滚动时保持重新定位视图。这似乎有很大的可能性,但可能值得一试。
此外,如果包含视图是可视容器而您需要查看它,则可以使用放置在CALayer顶部的superview中的CALayer来渲染滚动视图,因为CALayers与输入无关并且不会每次接触。
答案 2 :(得分: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;
}
答案 3 :(得分: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会收到它。如果您的UILabels很大并且正在拦截触摸,那么在它们上面放置另一个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)