4

UICollectionView在情节提要中构建了一个,并在视图控制器中实现了所有必需的数据源和委托方法。在情节提要中,我检查了Section Header集合视图上的属性并将标题视图的类设置为UICollectionResusableView(在情节提要中)的子类。

从这里,我通过故事板将两个 UI 元素拖到标题视图中——一个标签和一个分段控件:

在此处输入图像描述

执行程序时,标签出现在集合视图的标题视图中(不需要实际代码),但分段控件不会。然而,当一个分段控件被拖到一个典型的UIView. 即使通过 中的代码实例化IBOutlet,分段控件也不会出现。

为什么分段控件在典型的集合视图的标题上不可见UIView,为什么标签显示没有问题?

更新

这是自定义标题视图的 init 方法,我尝试以编程方式添加分段控件(而不是在情节提要中):

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        _segmentedControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"One", @"Two", nil]];
        [_segmentedControl setFrame:CGRectMake(0, 0, 100, 50)];
        [_segmentedControl addTarget:self action:@selector(segmentedControlChanged:) forControlEvents:UIControlEventValueChanged];
        [self addSubview:_segmentedControl];
    }
    return self;
}

根据要求,这是-[UICollectionReusableView viewForSupplementaryElementOfKind:]主视图控制器中的方法:

- (UICollectionReusableView *)collectionView:(UICollectionView *)cv viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
    GalleryHeader *headerView = [cv dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView" forIndexPath:indexPath];
    return headerView;
}
4

1 回答 1

4

我无法重现您的情节提要问题,当我通过直接在情节提要中拖动分段控件来添加分段控件时(无需代码),它对我来说效果很好。至于您以编程方式添加它的替代方法,这里的问题是,当从情节提要初始化视图时(在这种情况下),使用了initWithCoder初始化方法(而不是initWithFrame初始化方法)。因此,如果您覆盖该方法,将代码插入其中,它应该可以工作:

-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if(self){
        _segmentedControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"One", @"Two", nil]];
        _segmentedControl.bounds = CGRectMake(0, 0, 100, 50);
        [_segmentedControl addTarget:self action:@selector(segmentedControlChanged:) forControlEvents:UIControlEventValueChanged];
        [self addSubview:_segmentedControl];
    }
    return self;
}

PS它不会影响这种特定情况,但你应该这样做:

GalleryHeader *headerView = [cv dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"HeaderView" forIndexPath:indexPath];

代替:

GalleryHeader *headerView = [cv dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView" forIndexPath:indexPath];

由于集合视图会要求正确的视图类型,因此您应该担心指定它!

编辑:我从情节提要创建标题的步骤是:

  • 选择集合视图并勾选标有部分标题的框

  • 选择新创建的标题并在身份检查器中选择正确的类

在此处输入图像描述

  • 给标题部分一个唯一的标识符

在此处输入图像描述

  • 拖动故事板标题中的 UI 元素(我还更改了它的背景颜色)

在此处输入图像描述

  • 最后collectionView:viewForSupplementaryElementOfKind:atIndexPath:在您的集合视图的数据源类中实现该方法
 -(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView
          viewForSupplementaryElementOfKind:(NSString *)kind 
                                atIndexPath:(NSIndexPath *)indexPath
 {
     return [self.collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"collectionViewHeader" forIndexPath:indexPath];
 }

如果你能发现你所做的和我所做的有什么不同,请告诉我!

于 2013-06-18T14:13:09.420 回答