0

好的,这应该是一个简单的任务,但它一直让我发疯。

我想要实现的只是一个 UIScrollView 显示在屏幕侧面和底部的静态透明工具栏后面。该结构当前设置为滚动视图(UIScrollView 的子类)和叠加层(UIView 的子类)都是 RootViewController 的子视图。

scrollView = [[EMDrawScrollView alloc]initWithFrame:CGRectMake(0, 0, winSize.width, winSize.height)];
scrollView.userInteractionEnabled = YES;
[self.view addSubview:scrollView]; 

overlay = [[EMDrawOverlayView alloc]initWithFrame:CGRectMake(0, 0, winSize.width, winSize.height)];
overlay.userInteractionEnabled = NO;
[self.view addSubview:overlay];

问题是如果我启用overlay.userInteractionEnabled,所有的触摸都会进入图层并且无法进入scrollView。但是,如果我关闭用户交互,scrollView 可以正常工作,但我无法与叠加层进行交互。

关于处理触摸,我使用 RootViewController 收集它们并将它们发送到正确的对象,如下所示:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *t1 = [[[event allTouches]allObjects]objectAtIndex:0];
    CGPoint loc = [t1 locationInView:self.view];
    if (CGRectContainsPoint(overlay.rightToolbar.frame, loc)) {
        overlayTouched = YES;
        [overlay touchesBegan:touches withEvent:event];  
    }  else {
        overlayTouched = NO;
        [scrollView touchesBegan:touches withEvent:event];
    }
}

我有一种感觉,一个解决方法是将工具栏设置为单独的 UIView,并将它们作为子视图添加到视图控制器,这样覆盖就不会占据整个屏幕,但如果有另一种方法,我想避免这种情况。

4

1 回答 1

1

好的....看起来这个问题没有一个简单的答案,所以我已经解决了这个问题,按照我在问题中所说的做,并将每个覆盖添加为 UIView,其帧大小仅为其超级视图的大小。

这最终效果很好,因为我能够根据它所在的视图检测 touchesBegan 触摸,并且 touchesMoved 和 touchesEnd 保留在该视图中,这让我对用户交互有很大的控制权。

于 2012-07-16T00:04:33.943 回答