iOS10 – ContentView在UITableView头中阻塞UIButton

我正在使用Swift 2.3和Xcode 8 Beta 1更新我的应用程序到iOS10的过程中,我发现有一个UITableViewHeaderFooterContentView阻止在UITableViewHeaderFooterView子类上的UIButton触摸。

在Xcode 8 Beta 1模拟器上,UIButton在iOS9.3上运行,但不在iOS10上运行。

1)有没有这方面的文件?

2)如何确保我的UI元素位于iOS10中的新内容视图之上? (或允许通过UITableHeaderFooterContentView触摸)

谢谢!

调试iOS9.3和iOS10的视图层次结构

TableHeader.xib

表头

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

在视图控制器中的代码 dateCell.addNewEventButton是在iOS10中不再接收触摸的UIButton

 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 } 

有问题的视图实际上是UITableViewHeaderFooterViewcontentView (请参阅Apple Docs )。 所以你应该能够使用sendSubview(toBack:)来阻止它干扰触摸。

不过,在iOS9下,如果视图是从NIB加载的, UITableViewHeaderFooterView无法正确初始化contentView 。 尽pipecontentView属性不是可选的,但实际上它是零,并且如果尝试访问它,则会出现“错误访问”错误。 你也不能为contentView设置一个值(无论是在代码中还是作为IB的一个sockets),因为它是一个只读属性(*)。 所以我能想到的唯一的解决scheme就是使用#available来有条件的包含代码来移动contentView到后面,如果你在iOS 10或更新的版本上运行的话。 我会把相关的代码放到你的子类中:

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

(*)沉迷于疯狂的猜测,我的猜测是苹果基于UITableViewHeaderFooterView代码大量的UITableViewCell 。 由于IB在其对象库中有UITableViewCells (注意这些包含了单元格的contentView ),因此可以确保单元格的contentView被正确实例化。 但是由于对象库中没有UITableViewHeaderFooterView ,因此无法正确加载contentView 。 看起来像他们通过实例化一个空的contentView在iOS10中修复它。 可惜他们没有把UITableViewHeaderFooterView添加到库中。