¿Cómo ajustar la altura del encabezado de una vista de tabla en swift?

Tengo un UITableViewController. Esta vista de tabla tiene una vista de encabezado. Utilizo main.storyboard con autolayout para configurar mi controller.

En mi main.storyboard, para w: Any h: Any, la vista previa de mi controller de vista se establece con el tamaño pnetworkingeterminado 600×600. En el interior, mi vista de encabezado está configurada en 600×200.

En mi vista de encabezado, tengo una image de set en el modo Aspect Fill:

main.storyboard

Las limitaciones :

limitaciones

En los activos, mi image tiene tamaños @ 2x y @ 3x.

  • header-image@2x.png -> 750×498
  • header-image@3x.png -> 1242×825

Cuando compilo, en el simulador obtengo para iPhone 5:

IPH5

Para el iPhone 6:

IPH6

Para iPhone 6+:

IPH6 +

  • Para el iPhone 5, la image comienza debajo de la barra de estado. ¿No entiendo por qué?
  • Para el iPhone 6 y iPhone 6+, la image recorta la primera celda de la vista de mi tabla. Y la parte superior de la image no se ajusta con la parte superior de la vista.

No sé cómo ajustar la altura de tableHeaderView a la altura de mi image, ya que esta altura depende del dispositivo.

He intentado establecer programáticamente el marco del encabezado, en vano:

var frame:CGRect! frame.size.width = self.bgHeaderImageView.image?.size.width frame.size.height = self.bgHeaderImageView.image?.size.height self.tableView.tableHeaderView?.frame = frame 

Tengo 2 errores: "Valor opcional tipo CGFloat? No desenvuelto"

Y si corrijo con

  var frame:CGRect! frame.size.width = self.bgHeaderImageView.image?.size.width! frame.size.height = self.bgHeaderImageView.image?.size.height! self.tableView.tableHeaderView?.frame = frame 

Tengo 2 errores: "Operand of postfix! Debería tener un tipo opcional"

¿Es posible ajustar el tamaño en el guión gráfico directamente y no mediante progtwigción?

Probablemente me falte algo aquí …

Encontré una solución, no está muy limpia, pero funciona.

  var kTableHeaderHeight:CGFloat! //expected height of the header tableview var image: UIImage = UIImage(named: "my-image")! var frame:CGRect!=self.tableView.tableHeaderView?.frame if UIScreen.mainScreen().bounds.size.width <= 320 { //iPhone 5 and less frame.size.width = 320 frame.size.height = 212 } else { //iPhone 6 @2x and iPhone 6+ @3x frame.size.width = image.size.width frame.size.height = image.size.height } self.tableView.tableHeaderView?.frame = frame 

Prueba esto

  self.edgesForExtendedLayout = UIRectEdge.None self.automaticallyAdjustsScrollViewInsets = false self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0) 

Y esto también

 func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { if section == 0 { return 1 } else { return 40; // your other headers height value } } func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { if section == 0 { // Note CGFloat.min for swift // For Objective-c CGFLOAT_MIN let headerView = UIView.init(frame: CGRectMake(0.0, 0.0, self.tableView.bounds.size.width, CGFloat.min)) return headerView } else { // Construct your other headers here return UIView() } } 

El UITableView tableHeaderView no tiene opción para la relación de aspecto y el uso de la reproducción automática de tableHeaderView está limitado en InterfaceBuilder. Hay muchas maneras de lograr una altura dinámica de tableHeaderView. Si desea tener una altura tableHeaderView basada en la relación de una image de encabezado que puede usar:

 let width = UIScreen.mainScreen().bounds.size.width self.height = (width/640) * 209 //calculate new height self.tableView.tableHeaderView?.frame.size = CGSize(width: self.tableView.tableHeaderView!.frame.size.width, height: self.height)