¿Cómo puedo networkingimensionar dinámicamente una vista de encabezado en UICollectionView?

Tengo un encabezado (una UICollectionReusableCell) en un UICollectionView cuya altura debe ser variable. ¿Cómo puedo hacer que se networkingimensione de acuerdo con la altura de su contenido?

No necesito admitir iOS 7, y las soluciones de Autolayout son preferibles (si existen).

Así es como lo resolví. Ojalá fuera más elegante.

  1. Establezca UILabel en la vista de encabezado para tener un valor numberOfLines de 0. Esto le permitirá networkingimensionarse.
  2. Mueve el encabezado fuera del guión gráfico y hacia una xib.
  3. En collectionView(_:layout:referenceSizeForHeaderInSection:) instale un encabezado desde el xib. Lo usaremos para calcular un tamaño.
  4. Establezca el encabezado en el ancho deseado (en mi caso, el ancho de la vista de colección), y configúrelo con el text e imágenes deseados
  5. Llame setNeedsLayout y layoutIfNeeded .
  6. Use systemLayoutSizeFittingSize(UILayoutFittingCompressedSize) para calcular la altura.
  7. Devuelve la altura y el ancho como CGSize

Notas:

  • El encabezado se debe mover fuera del guión gráfico y en un xib porque llamar a dequeuReusableSupplementaryViewOfKind desde systemLayoutSizeFittingSize(UILayoutFittingCompressedSize) provoca un locking.

  • La vista del encabezado debe poder calcular una altura correcta solo sabiendo su contenido y el ancho deseado. Esto tomó un poco de juego con las limitaciones.

Aquí sería mi enfoque:

  1. Cree puntos de venta para su encabezado y sus contenidos.
  2. Obtén la altura de tus contenidos.
  3. Establezca la altura de su encabezado como% de los contenidos.

En su controller de vista:

  func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = yourCollectionView.dequeueReusableCellWithReuseIdentifier("YourCustomCell", forIndexPath: indexPath) as! YourCustomeCell ... cell.setUpCell() return cell } 

En su celda de vista:

 @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 }