【问题标题】:UICollectionView Header Compatible ViewsUICollectionView 标头兼容视图
【发布时间】:2013-06-10 16:01:24
【问题描述】:

我在情节提要中构建了一个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;
}

【问题讨论】:

  • 你实现uicollectionviewdatasource方法collectionView:viewForSupplementaryElementOfKind:atIndexPath:了吗?
  • 是的,我做到了。我也会发布代码。
  • 好的,那就等编辑吧

标签: ios storyboard uicollectionview uicollectionreusableview


【解决方案1】:

我无法重现您的情节提要问题,当我通过将分段控件直接拖动到情节提要中添加分段控件(无需代码)时,它对我来说效果很好。至于以编程方式添加它的替代方法,这里的问题是,当从情节提要初始化视图时(在这种情况下),使用 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;
}

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

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

代替:

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

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

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

  • 选择集合视图并勾选标记为Section Header的框

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

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

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

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

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

【讨论】:

  • 感谢您的回复。我了解initWithFrame: 问题,并改用initWithCoder: 方法,但无济于事。您提到您无法重现情节提要问题。也许你可以把你做的测试项目发给我,这样我就可以并排比较两者。
  • 恐怕分享整个项目不会那么简单,因为我有一些我无法分享的工作内容!无论如何等一下,你如何定义_segmentedControl?它是一个出口吗?
  • 这是头文件中的一个简单属性:@property (nonatomic, strong) UISegmentedControl *segmentedControl;,所以不,它不是插座。
  • 好的,我将编辑我的问题并逐步完成我所做的,也许您可​​以发现与您所做的不同
  • 谢谢你,之前的下午很无聊:)
猜你喜欢
  • 2016-12-31
  • 2012-03-03
  • 1970-01-01
  • 2017-02-25
  • 2017-02-11
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 2013-03-04
相关资源
最近更新 更多