UICollectionView
のセクションヘッダーの高さを動的に設定しようとしていますが、以下のコードを使用すると、何も変化しません。ビューには正しいアイテムが描画されますが、高さは変化しません。これが繰り返し質問される場合は申し訳ありませんが、UICollectionView
オブジェクトに特に関連するものを見つけることができないようです。前もって感謝します。
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView
viewForSupplementaryElementOfKind:(NSString *)kind
atIndexPath:(NSIndexPath *)indexPath
{
PhotoVideoHeaderCell *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader
withReuseIdentifier:@"videoHeaderView"
forIndexPath:indexPath];
if (indexPath.section == 0) {
// photos
[headerView setSection:@"Photo"];
} else {
[headerView.VehicleDetailView removeFromSuperview];
CGRect frame = headerView.frame;
frame.size.height = 60;
[headerView setFrame:frame];
[headerView setNeedsDisplay];
[headerView setBackgroundColor:[UIColor grayColor]];
[headerView setSection:@"Video"];
}
return headerView;
}
フローレイアウトを使用している場合、デリゲートは次の関数を実装する必要があります。
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section;
ヘッダーごとに異なるサイズを返すことができます。水平方向にスクロールするコレクションビューでは、幅のみが使用されます。垂直にスクロールするものでは、高さのみが使用されます。未使用の値は無視されます。ビューは常に、それぞれ水平/垂直コレクションビューの高さ/幅全体に合わせて拡大されます。
フッターにも対応する方法があります。
Swift 3 and 4:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
return CGSize(width: collectionView.frame.size.width, height: 250)
}
さて、ノイズの多いデリゲートメソッドを使用する代わりに、これを使用することを好みます(一意のヘッダーサイズがある場合にのみ機能します)
let layout = self.collectionView.collectionViewLayout as! UICollectionViewFlowLayout // Assuming you use the default flow layout
layout.headerReferenceSize = CGSize(width: 42, height: 42) //Set the header size
ItemSizeでも動作します:
layout.itemSize = CGSize(width: 42, height: 42) //Set a custom item size
これは、例の画面幅に関連してアイテムのサイズを設定するのに最適です。
次のようなものを試してください:
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
UICollectionReusableView *header = [siteMapCollection dequeueReusableSupplementaryViewOfKind: UICollectionElementKindSectionHeader withReuseIdentifier: @"headerID" forIndexPath: indexPath];
NSString *headerText = @"This is my header";
UIFont *labFont = [UIFont fontWithName: @"HelveticaNeue-CondensedBold" size: 20.0];
CGSize textSize = [dummyText sizeWithFont: labFont];
UILabel *headerLabel = [[UILabel alloc] initWithFrame: CGRectMake(0, header.frame.size.height - (textSize.height + 12), header.frame.size.width, textSize.height + 8)];
[headerLabel setFont: labFont];
[header addSubview: headerLabel];
return header;
}