通过UIScrollView将某些触摸传递给基础视图

时间:2014-02-03 15:17:42

标签: ios objective-c uiscrollview

我的视图有两个子视图:

  1. Subview A,一个UIView(包含其他视图,包含UIButtons,带有gesturerecognizer的视图......)
  2. 子视图B,UIScrollView(包含一些视图,但具有透明区域)。
  3. 滚动视图位于子视图A的顶部,并具有完整的设备宽度/高度。我希望用户能够通过透明区域与滚动视图下方的所有按钮和手势重新配置器进行交互,同时仍然可以滚动(因此传递最小的测试结果)。

    似乎是一项足够简单的任务,但我无法让它发挥作用。滚动视图始终阻止所有触摸。

    知道如何实现这一目标吗?谢谢!

3 个答案:

答案 0 :(得分:12)

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

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event

如果此方法返回NO,则对于触摸事件,scrollview将是“透明的”。

如果您希望滚动视图对于触摸事件是“透明的”,只有当触摸位于滚动视图的透明区域时,您的实现应如下所示:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
     return ![self isPointInsideATransparentRegion:point]; //you need to implement isPointInsideATransparentRegion to check whether the point touched is in a transparent region or not
}

答案 1 :(得分:2)

我现在已经解决了这个问题,方法是将滚动视图下方的视图添加到scrollview作为第一个子视图,并在scrollViewDidScroll中移动它的位置:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
    [self updateBottomViewPosition];
}

- (void)updateBottomViewPosition {
    CGPoint contentOffset = _mainScrollView.contentOffset;

    CGFloat y = MAX(contentOffset.y, 0);

    CGRect frame = _bottomPage.frame;
    if (y != frame.origin.y) {
        frame.origin.y = y;
        _leadPage.frame = frame;
    }
}

这很有效,但它可能不尽如人意。

答案 2 :(得分:0)

根据René的回答,如果背景视图固定(f.e.在视图顶部)并且底部滚动有反弹,则此方法有效。

#pragma mark - Scroll delegate

-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
    [self updateBottomViewPosition];
}

- (void)updateBottomViewPosition {
    CGPoint contentOffset = self.scrollView.contentOffset;

    CGFloat y = MAX(contentOffset.y, 0);


    CGRect frame = self.fixedView.frame;
    if (y > 0) {
        frame.origin.y = y;
    } else {
        frame.origin.y = 0;
    }
    self.fixedView.frame = frame;
}

您可以使用它来创建一个漂亮的paralax效果,如果您不想修复它,您应该将y值更改为您想要的过渡运动。