Reputation: 4119
I have header (a UICollectionReusableCell) in a UICollectionView whose height needs to be variable. How can I have it resize itself according to the height of its contents?
I do not need to support iOS 7, and Autolayout solutions are preferable (if they exist).
Upvotes: 4
Views: 7705
Reputation: 4119
This is how I solved it. I wish it was more elegant.
UILabel
in the header view to have a numberOfLines
value of 0. This will let it resize itself.collectionView(_:layout:referenceSizeForHeaderInSection:)
instantiate a header from the xib. We'll use it to compute a size.setNeedsLayout
and layoutIfNeeded
.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
to compute the height.Notes:
The header must be moved out of the storyboard and into a xib because calling dequeuReusableSupplementaryViewOfKind
from systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
causes a crash.
The header view must be able to compute a correct height only knowing its content and the desired width. This took some fiddling with the constraints.
Upvotes: 14
Reputation: 426
Here would be my approach -
In your View Controller -
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = yourCollectionView.dequeueReusableCellWithReuseIdentifier("YourCustomCell", forIndexPath: indexPath) as! YourCustomeCell
...
cell.setUpCell()
return cell
}
In your View Cell -
@IBOutlet weak var headerView: UIView!
@IBOutlet weak var contentView: UIView!
func setUpCell() {
let percentageYouWant = 0.3
let newFrame = CGRect(x: 0, y: 0, width: contentView * percentageYouWant, height: contentView * percentageYouWant)
headerView.frame = newFrame
}
Upvotes: -2