我在故事板中构建了一个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;
}
答案 0 :(得分: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;
}
P.S。它不会影响这种特定情况,但您应该这样做:
GalleryHeader *headerView = [cv dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"HeaderView" forIndexPath:indexPath];
而不是:
GalleryHeader *headerView = [cv dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView" forIndexPath:indexPath];
由于要求提供正确视图的集合视图,您应该担心指定它!
编辑:我从故事板创建标题的步骤是:
collectionView:viewForSupplementaryElementOfKind:atIndexPath:
方法
-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView
viewForSupplementaryElementOfKind:(NSString *)kind
atIndexPath:(NSIndexPath *)indexPath
{
return [self.collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"collectionViewHeader" forIndexPath:indexPath];
}
如果你能发现你做了什么和我做了什么之间的任何区别,请告诉我。