微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – UICollectionView标头兼容视图

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

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

执行程序时,标签出现在集合视图的标题视图中(不需要实际代码),但分段控件不会.但是,当分段控件被拖动到典型的UIView上时,它会显示并且可以操作而不需要代码.即使通过IBOutlet中的代码实例化,也不会出现分段控件.

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

UPDATE

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

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        _segmentedControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"One",@"Two",nil]];
        [_segmentedControl setFrame:CGRectMake(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;
}

解决方法

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

-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if(self){
        _segmentedControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"One",nil]];
        _segmentedControl.bounds = CGRectMake(0,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];
 }

如果你能发现你做了什么和我做了什么之间的任何区别,请告诉我!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐