Ios 通过UIScrollView将某些触摸传递到基础视图
我有一个视图,它有两个子视图:Ios 通过UIScrollView将某些触摸传递到基础视图,ios,objective-c,uiscrollview,Ios,Objective C,Uiscrollview,我有一个视图,它有两个子视图: 子视图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没有提供更简单的方法。不过,这比实现轻触手势更简洁。