我在UIScrollView中有一个UIScrollView和一个UITableView。
我想拦截UITableView的滚动,只有在超级视图(UIScrollView)到达特定的contentOffset时才允许滚动。
我已经创建了UIScrollView和UITableView的子类,如何在用户仍在滚动时捕获滚动事件并拦截滚动?
我想要完成的例子: UITableView将有一个标题,如果我向下滚动标题将折叠到原始大小的30%,并保持在顶部可见。在我滚动回到UITableView的顶部后,我希望标题扩展。换句话说,我想用可以折叠/展开的标题来扩展UITableView的滚动。
可能有更好的方法来实现这一点,我愿意接受建议。
答案 0 :(得分:1)
可能有更好的方法,但这个解决方案对我有用。
self.innerScrollView
)设置一个插座。scrollView.bounces = YES
和innerScrollView.bounces = NO
。scrollView.contentSize.height
设置为view.frame.size.height
+您希望消失的标题的70%。调整 innerScrollView 的大小,将调整后的contentView填充到底部。将视图控制器设置为 scrollView 的委托,并按如下方式实现scrollViewDidScroll:
:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGFloat maxYOffset = self.scrollView.contentSize.height - self.scrollView.frame.size.height;
CGFloat minInnerYOffset = self.innerScrollView.contentInset.top;
CGFloat currentYOffset = scrollView.contentOffset.y;
CGFloat newYOffsetDelta = currentYOffset - maxYOffset;
CGFloat currentInnerYOffset = self.innerScrollView.contentOffset.y;
if (scrollView.contentOffset.y >= maxYOffset) {
self.innerScrollView.scrollEnabled = YES;
self.scrollView.contentOffset = CGPointMake(0, maxYOffset);
if (currentYOffset != maxYOffset) {
self.innerScrollView.contentOffset = CGPointMake(0, currentInnerYOffset + newYOffsetDelta);
}
}
else if (currentInnerYOffset > minInnerYOffset) {
self.scrollView.contentOffset = CGPointMake(0, maxYOffset);
self.innerScrollView.contentOffset = CGPointMake(0, currentInnerYOffset + newYOffsetDelta);
}
else if (currentYOffset < scrollView.contentInset.top) {
scrollView.contentOffset = CGPointMake(0, scrollView.contentInset.top);
}
else {
self.lowerScrollView.scrollEnabled = NO;
}
}
我只是掀起了这个并迅速测试了它。这一切似乎都有效,但可能需要一些改进和调整。无论如何,这应该至少让你开始。
答案 1 :(得分:-1)
好吧,您应该使用以下UIScrollViewDelegate方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
// here perform the action you need
}