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

Ios 通过UIScrollView将某些触摸传递到基础视图,ios,objective-c,uiscrollview,Ios,Objective C,Uiscrollview,我有一个视图,它有两个子视图: 子视图A、UIView(包含其他视图,其中包含UIButtons、带有手势识别器的视图…) 子视图B,一个UIScrollView(包含一些视图,但具有透明区域) 滚动视图位于子视图A的顶部,具有完整的设备宽度/高度。我希望用户能够通过透明区域与scrollview下面的所有按钮和手势识别器进行交互,同时仍然能够滚动(这样就不能通过hittest了) 这似乎是一项很容易的任务,但我无法让它工作。scrollview始终阻止所有触摸 你知道我该怎么做吗?谢谢 您应该

我有一个视图,它有两个子视图:

  • 子视图A、UIView(包含其他视图,其中包含UIButtons、带有手势识别器的视图…)
  • 子视图B,一个UIScrollView(包含一些视图,但具有透明区域)
  • 滚动视图位于子视图A的顶部,具有完整的设备宽度/高度。我希望用户能够通过透明区域与scrollview下面的所有按钮和手势识别器进行交互,同时仍然能够滚动(这样就不能通过hittest了)

    这似乎是一项很容易的任务,但我无法让它工作。scrollview始终阻止所有触摸


    你知道我该怎么做吗?谢谢

    您应该对UIScrollView进行子类化,并覆盖以下方法:

    -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
    
    如果此方法返回NO,则scrollview对于触摸事件将是“透明”的

    由于您希望仅当触摸位于scrollview的透明区域时,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
    }
    

    我现在已经解决了这个问题,将应该位于scrollview下方的视图添加到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;
        }
    }
    

    这是可行的,但可能没有那么优雅。

    根据勒内的回答,如果背景视图是固定的(即视图顶部的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;
    }
    

    你可以用它来创造一个很好的松弛效果,如果您不想将其固定,则应将y值更改为所需的过渡运动。

    为什么滚动视图首先位于其他视图之上?滚动视图中的视图需要与下面的视图重叠。如果用户只在实体区域上滚动,这将起作用。然而,在透明区域上的平移手势仍然会使scrollview滚动。这正是我所寻找的解决方案。很遗憾,IOS没有提供更简单的方法。不过,这比实现轻触手势更简洁。