iOS10 - блокировка ContentView Касания UIButton в заголовке UITableView
Я нахожусь в процессе обновления моего приложения до iOS10 с Swift 2.3 и Xcode 8 Beta 1, и я обнаружил, что есть UITableViewHeaderFooterContentView
который блокирует прикосновения к UIButton на моем подклассе UITableViewHeaderFooterView
,
На симуляторе Xcode 8 Beta 1 UIButton работает на iOS9.3, но не на iOS10.
1) Есть ли документация для этого?
2) Как я могу убедиться, что мои элементы пользовательского интерфейса находятся над новым представлением контента в iOS10? (или разрешить касания через UITableHeaderFooterContentView
)
Спасибо!
Заголовок таблицы
import UIKit
class TableHeader: UITableViewHeaderFooterView {
@IBOutlet weak var dayLabel: UILabel!
@IBOutlet weak var dateLabel: UILabel!
@IBOutlet weak var addNewEventButton: UIButton!
}
Code In View ControllerdateCell.addNewEventButton
UIButton, который больше не получает прикосновения в 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
}
1 ответ
Оскорбительный взгляд на самом деле contentView
из UITableViewHeaderFooterView
(см. Apple Docs). Таким образом, вы должны быть в состоянии использовать sendSubview(toBack:)
чтобы это не мешало прикосновениям.
Тем не менее, кажется, что под iOS9 UITableViewHeaderFooterView
не может правильно инициализировать contentView
если представление загружается из NIB. Хотя contentView
свойство не является обязательным, оно фактически равно nil, и вы получаете ошибку BAD ACCESS, если пытаетесь получить к нему доступ. Также вы не можете установить значение для contentView
(либо в коде, либо как выход в IB), потому что это свойство только для чтения (*). Так что единственное решение, которое я могу придумать, это использовать #available
включить условно код, чтобы переместить contentView назад, если вы работаете на iOS 10 или новее. Я бы поместил соответствующий код в ваш подкласс:
override func awakeFromNib() {
if #available(iOS 10, *) {
self.sendSubview(toBack: contentView)
}
}
(*) Предаваясь диким спекуляциям, я предполагаю, что Apple основала UITableViewHeaderFooterView
код в значительной степени на UITableViewCell
, Так как IB имеет UITableViewCells
в своей библиотеке объектов (и обратите внимание, что они включают в себя ячейки contentView
), это может гарантировать правильное создание экземпляра contentView ячейки. Но так как нет UITableViewHeaderFooterView
в объектной библиотеке нет способа получить contentView
загружен правильно. Похоже, они исправили это в iOS10, создав пустой экземпляр contentView
, Жаль, что они не добавили UITableViewHeaderFooterView
В библиотеку.