UICollectionView在最后一个UITableViewCell和一致滚动?怎么样?

Bra*_*cal 9 cocoa-touch objective-c uitableview uiscrollview ios

我对这个问题感到头脑发热,我知道这必须是可能的,但是在仔细阅读了所有文档后,我仍然无法想出一些效果很好的东西.

基本上,我在UITableView的最后一个单元格中有一个UICollectionView.我想要发生的是,只有当UITableView完全滚动到底部时,它的最后一个单元格中的UICollectionView才能开始滚动.并且,如果TableView偏移在拖动/平移期间到达CollectionView的tableviewcell的底部,则当前表视图拖动/平移的任何其他拖动应该影响集合视图而不是表视图.

此外,当集合视图滚动时,如果用户开始在集合视图上滚动,如果集合视图到达其顶部的滚动(内容Y偏移为0或更小),并且当前平移/拖动手势的其他滚动影响应该导致包含表视图向上滚动.

我想实现这种效果的原因是因为包含集合视图的最后一个单元格上方的表格视图单元格包含一个UISegmentControl,用于切换UICollectionView的内容,我希望用户能够随时切换此段在CollectionView中滚动.这意味着集合视图必须滚动,但父表视图不需要滚动..

我尝试过使用手势识别器,并尝试使用

– gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
Run Code Online (Sandbox Code Playgroud)

如果集合视图要滚动到负偏移量(过去它的顶部偏移量)或者表视图已达到它的总滚动结束,我可以使用一个标志向该方法返回yes/no.我有点接近我想要达到的目标,但是如果我在集合视图上慢慢向上滚动,它不会触发同时识别器,如果我在表格视图上向下滚动太慢也会发生同样的情况.

另一个问题是,我不希望集合视图反弹.但是,将弹跳设置为"完全"会完全阻止同时识别器触发.我甚至尝试在CGDZero的集合视图中将内容偏移设置为viewDidScroll,如果它的y偏移低于零.这也不起作用并阻止同步方法发射...

有谁知道该怎么办?还是有什么能指引我正确的方向?

更新 -

仍在努力,我在努力实现的行为方面取得了一些进展.我已经在viewDidScroll方法中切换了userInteractionEnabled,就像我在willBeginDragging中尝试过的那样.与scrollEnabled属性相同..没有运气:(我得到的行为类似于我想要的行为,但是父视图不会向上滚动,直到用户离开屏幕并尝试再次滚动..

更新 -

无论如何转换当前处理滚动事件的panGestureRecognizer在滚动期间?如果我可以将滚动处理程序从子项转换为父项,同时仍然滚动这将解决我的问题.我查看了苹果的手势相关和uiscrollview相关文档,但找不到任何接近这样做的内容.

更新 -

刚尝完这样的事情......

- (CGPoint)maxParentContentOffset
{
    return CGPointMake(0, self.parentScrollView.contentSize.height - self.frame.size.height - 44);
}

- (void)parentScrollViewDidScroll:(UIScrollView *)parentScrollView
{
    if (self.contentOffset.y > 0) {
        self.parentScrollView.contentOffset = [self maxParentContentOffset];
    }
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (scrollView.contentOffset.y < 0) {
        scrollView.contentOffset = CGPointZero;
    }
}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    CGPoint translation = [scrollView.panGestureRecognizer velocityInView:scrollView.superview];
    if (translation.y < 0) {
        [UIView animateWithDuration:0.5f animations:^(void) {
            self.parentScrollView.contentOffset = [self maxParentContentOffset];
        }];
    }
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

但是有一个问题...由于某种原因,我继续在以下方法上获得错误的访问错误

- (void)parentScrollViewDidScroll:(UIScrollView *)parentScrollView
    {
        if (self.contentOffset.y > 0) {
            self.parentScrollView.contentOffset = [self maxParentContentOffset];
        }
    }
Run Code Online (Sandbox Code Playgroud)

具体设置内容偏移量.这真的很奇怪,因为有断点我看到parentScrollView和self被设置.我想知道它是不是一个糟糕的访问,但由于某种原因它被困在无限循环中?有任何想法吗?

Bra*_*cal 3

经过好 8 个小时后才解决这个问题。由于父滚动视图偏移的无限设置,我遇到了冲突,因为我有多个属于同一类的对象,每当其父视图滚动时都会收到调用,两者都试图设置相同的父视图偏移量为零,这导致另一个类看到滚动变化,并调用它们的方法来更改偏移量,并且该过程无限发生导致崩溃。

然而,这段代码解决了所有问题,并且功能完全按照我的预期运行。希望这可以帮助将来希望在父滚动视图和子滚动视图之间获得一致滚动的其他人。

- (CGPoint)maxParentContentOffset
{
    return CGPointMake(0, self.parentScrollView.contentSize.height - self.frame.size.height - 44);
}

- (void)parentScrollViewDidScroll:(UIScrollView *)parentScrollView
{
    if (self.contentOffset.y > 0 && self.isDragging) {
        self.parentScrollView.contentOffset = [self maxParentContentOffset];
    }
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (scrollView.contentOffset.y < 0) {
        scrollView.contentOffset = CGPointZero;
    }
}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    CGPoint translation = [scrollView.panGestureRecognizer velocityInView:scrollView.superview];
    if (translation.y < 0) {
        [UIView animateWithDuration:0.5f animations:^(void) {
            self.parentScrollView.contentOffset = [self maxParentContentOffset];
        }];
    }
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}
Run Code Online (Sandbox Code Playgroud)