iOS10: toques de locking ContentView de UIButton en encabezado UITableView

Estoy en el process de actualizar mi aplicación a iOS10 con Swift 2.3 y Xcode 8 Beta 1 y he encontrado que hay una UITableViewHeaderFooterContentView que bloquea los toques al UIButton en mi subclass de UITableViewHeaderFooterView .

En el simulador Xcode 8 Beta 1, el UIButton funciona en iOS9.3 pero no iOS10.

1) ¿Hay alguna documentation para esto?

2) ¿Cómo puedo asegurarme de que mis elementos de interfaz de usuario estén en la parte superior de la nueva vista de contenido en iOS10? (o permitir toques a través de UITableHeaderFooterContentView )

¡Gracias!

Debug View Hierarchy de iOS9.3 y iOS10

TableHeader.xib

Encabezado de tabla

 import UIKit class TableHeader: UITableViewHeaderFooterView { @IBOutlet weak var dayLabel: UILabel! @IBOutlet weak var dateLabel: UILabel! @IBOutlet weak var addNewEventButton: UIButton! } 

Code In View Controller dateCell.addNewEventButton es el button UIB que ya no recibe toques en iOS10

 func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let tintColor = TintManager().getTintColour() let dateCell:TableHeader = tableView.dequeueReusableHeaderFooterViewWithIdentifier("TableHeader") as! TableHeader //dateCell.bringSubviewToFront(dateCell.addNewEventButton) dateCell.dayLabel.text = Dates.day.uppercaseString dateCell.dateLabel.text = Dates.date dateCell.backgroundView = UIView(frame: dateCell.frame) dateCell.backgroundView!.backgroundColor = tintColor dateCell.dayLabel.textColor = UIColor.whiteColor() dateCell.dateLabel.textColor = UIColor.whiteColor() dateCell.addNewEventButton.backgroundColor = tintColor dateCell.addNewEventButton.tag = section dateCell.addNewEventButton.layer.cornerRadius = 20.0 if (savedEventView.superview === self.view) { dateCell.addNewEventButton.removeTarget(nil, action: nil, forControlEvents: .AllEvents) dateCell.addNewEventButton.addTarget(self, action: #selector(ViewController.userPressedAddButtonToInsertSavedEvent(_:)), forControlEvents:.TouchUpInside) } else { dateCell.addNewEventButton.removeTarget(nil, action: nil, forControlEvents: .AllEvents) dateCell.addNewEventButton.addTarget(self, action: #selector(ViewController.userPressedAddNewEventOnTableViewHeader(_:)), forControlEvents:.TouchUpInside) } return dateCell } 

La vista ofensiva es, de hecho, la contentView de UITableViewHeaderFooterView (consulte los Apple Docs ). Por lo tanto, debería poder usar sendSubview(toBack:) para evitar que interfiera con los toques.

Sin embargo, parece que, en iOS9, UITableViewHeaderFooterView no puede inicializar correctamente el contentView la vista si la vista se carga desde una NIB. Aunque la propiedad contentView no es opcional, de hecho es nula, y obtienes un error de ACCESO MALO si intentas acceder a él. Tampoco puede establecer un valor para contentView (ya sea en código o como salida en IB) porque es una propiedad de solo lectura (*). Entonces, la única solución en la que puedo pensar es usar #available para include condicionalmente el código para mover el contenido de la vista atrás, si se está ejecutando en iOS 10 o posterior. Puse el código relevante en su subclass:

 override func awakeFromNib() { if #available(iOS 10, *) { self.sendSubview(toBack: contentView) } } 

(*) Complaciendo las especulaciones salvajes, supongo que Apple basó el código UITableViewHeaderFooterView gran medida en UITableViewCell . Como IB tiene UITableViewCells en su biblioteca de objects (y se da count de que incluyen contenido de la celda), puede garantizar que el contenido de la celda se cree correctamente. Pero como no hay UITableViewHeaderFooterView en la biblioteca de objects, no hay forma de que el contenido de contentView cargue correctamente. Parece que lo arreglaron en iOS10 instanciando un contenido vacío. Lástima que tampoco agregaron UITableViewHeaderFooterView a la biblioteca.