UIScrollView 上的 UIView 菜单

Posted

技术标签:

【中文标题】UIScrollView 上的 UIView 菜单【英文标题】:UIView Menu Over UIScrollView 【发布时间】:2012-07-12 09:46:59 【问题描述】:

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

我想要实现的只是一个 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 可以正常工作,但我无法与叠加层进行交互。

关于处理触摸,我使用 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,并将它们作为子视图添加到视图控制器,这样覆盖就不会占据整个屏幕,但如果有,我想避免这种情况另一种方式。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于UIScrollView 上的 UIView 菜单的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollview 内的 UIView 内的 UILabel 上的 UIGestureRecognizer

在 UIScrollview 中的 UIView 上的屏幕中的框架

UIScrollView 内的 UIView 上的 UIButton

如何访问添加到 UIScrollView 的 UIView 上的控件

UIScrollView中的UIView不出现

iPhone UIScrollview:当位于 Scroll View 的子 UIView 上的 480 像素以下时,按钮不响应