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)

Спасибо!

Отладка Просмотр иерархии 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!

}

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 В библиотеку.

Другие вопросы по тегам