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

Ren*_*ené 9 objective-c uiscrollview ios

我有一个有两个子视图的视图:

  1. 子视图A,UIView(包含其他视图,包含UIButtons,带有手势识别器的视图......)
  2. 子视图B,UIScrollView(包含一些视图,但具有透明区域).

滚动视图位于子视图A的顶部,并具有完整的设备宽度/高度.我希望用户能够通过透明区域与滚动视图下方的所有按钮和手势重新配置器进行交互,同时仍然能够滚动(因此传递最小的测试结果).

看起来像一个足够简单的任务,但我无法让它工作.滚动视图始终阻止所有触摸.

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

tan*_*one 12

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

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
Run Code Online (Sandbox Code Playgroud)

如果此方法返回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
}
Run Code Online (Sandbox Code Playgroud)

  • 如果用户只应滚动实体区域,这将起作用.但是,透明区域上的平移手势仍应使滚动视图滚动. (3认同)

Ren*_*ené 2

我现在通过将应该位于滚动视图下方的视图添加到滚动视图作为第一个子视图,并在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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这可行,但可能不太优雅。