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
触摸)
谢谢!
表头
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 }
有问题的视图实际上是UITableViewHeaderFooterView
的contentView
(请参阅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
添加到库中。