如何在自定义流布局中显示或隐藏装饰视图?

时间:2014-08-07 12:30:04

标签: ios uicollectionview uicollectionviewlayout

我实现了一个流式布局,顶部有一个粘性装饰视图。这是通过继承UICollectionViewFlowLayout并重写以下方法来实现的:

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds {
    return YES;
}

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {
    NSMutableArray *result = [[super layoutAttributesForElementsInRect:rect] mutableCopy];
    [result addObject:[self stickyHeaderLayoutAttributes]];

    return result;
}

(在内部,装饰视图的布局属性存储为属性,-stickyHeaderLayoutAttributes更新其框架以始终显示在集合视图的顶部。)

现在,我在集合视图控制器的导航栏上有一个切换按钮,它使用自定义流布局显示一些数据。点击切换按钮,可以通过在导航栏下滑动来隐藏装饰视图。第二个水龙头应该显示它(再次,从导航栏下方滑动)。

我隐藏装饰视图的方法如下(它以类似的方式显示它):

  1. 点击按钮时,告诉布局隐藏装饰视图,例如通过设置标志。
  2. 调用

     [self.collectionView performBatchUpdates:nil completion:nil];
    
  3. layoutAttributesForElementsInRect:中,不传递装饰视图的布局属性。
  4. finalLayoutAttributesForDisappearingSupplementaryElementOfKind:atIndexPath:被调用,我将框架设置在导航栏下。
  5. 集合视图会删除装饰视图并将其滑动到导航栏下。
  6. 然而,我注意到,只是在第2步, finalLayoutAttributesForDisappearingSupplementaryElementOfKind:atIndexPath:被调用,这意味着装饰视图应该被移除。

    为什么会这样?

    indexPathsToDeleteForSupplementaryViewOfKind:返回一个空数组,因此我不清楚为什么要删除装饰视图。

    有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:0)

如果您只想删除装饰视图,可以使用removeFromSuperview。

我展示了一个嵌套在容器视图中的collectionView,并使用以下内容删除装饰视图(BGSScheduleDecorationView):

- (IBAction)butAction1:(id)sender
{
    for (UIView *view in self.myCollectionVC.collectionView.subviews) {
        if ([view isKindOfClass:[BGSScheduleDecorationView class]])
        {
            [view removeFromSuperview];
        }

    }

}