4

我的集合视图开始很短,在它的视图控制器视图的底部。当用户向上滚动一点时,我希望集合填充视图。当用户拉入反弹区域时,我希望它再次缩小。

这是我想让工作的代码(我认为应该工作):

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView == self.collectionView) {
        CGFloat offsetY = self.collectionView.contentOffset.y;
        if (offsetY > 20.0) {
            [self setCollectionViewExpanded:YES];
        } else if (offsetY < -10.0) {
            [self setCollectionViewExpanded:NO];
        }
    }
}

- (void)setCollectionViewExpanded:(BOOL)expanded {

    // avoid starting a do-nothing animation
    BOOL currentlyExpanded = self.collectionView.frame.origin.y == 0.0;
    if (expanded == currentlyExpanded) return;

    // note: the collection view is the uppermost subview of the vc's view
    // expanding to view bounds makes it cover every other view
    CGRect newFrame = (expanded)? self.view.bounds : CGRectMake(0.0, 240.0, 320.0, self.view.bounds.size.height-240.0);
    [UIView animateWithDuration:0.3 animations:^{
        self.collectionView.frame = newFrame;
    }];
}

但是在展开之后,单元格相对于父视图保持在相同的位置(仍然靠近底部),并且集合视图停止响应平移触摸并且不再发送 didScroll 通知。

我可以通过在动画完成块中执行 reloadData 来正确重新定位内容,但是滚动触摸停止工作。

不久前,我用表格视图(或另一种滚动视图)尝试了类似的操作,但遇到了类似的挂断。如果有人解决了这个问题,非常感谢...

4

1 回答 1

0

你能更好地描述你的视图层次结构吗?UICollectionView 是 UIScrollView 的子视图吗?

self.viewUIScrollView 吗?

  • 在这种情况下,边界原点是滚动视图的 contentOffset(不是 0,0)。这可能会给你的 UICollectionView 一个意想不到的框架。
  • 如果 UICollectionView 是滚动视图的子视图,则框架原点是滚动视图空间中视图的原点。所以不要改变框架的原点(只是它的大小)并设置 scrollView 的 contentOffset 以使其可见。
于 2013-04-01T15:37:13.427 回答