Изменить заголовок раздела UITableView, когда он сверху - PullRequest
0 голосов
/ 15 мая 2018

Я использую пользовательский заголовок из файла Xib для представления таблицы, используя этот код:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let result: Result = (self.responseData?.result![section])!

    let headerCell = Bundle.main.loadNibNamed("HeaderViewTableViewCell", owner: self, options: nil)?.first as!  HeaderViewTableViewCell
   headerCell.sectionName.text = "Title"
    if (section == 0) {
        headerCell.sectionName.textColor = UIColor(red: 49/255.0, green: 149/255.0, blue: 213/255.0, alpha: 1)
    }

    return headerCell
}

Затем я хочу изменить заголовок sectionName, когда он прокручивается вверх, я попробовал этот код

let topSection = self.mainTable .indexPathsForVisibleRows?.first?.section
let currentHeader : HeaderViewTableViewCell = self.mainTable .headerView(forSection: topSection!) as HeaderViewTableViewCell
currentHeader.sectionName.textColor = UIColor.red

Но я получаю эту ошибку: Невозможно преобразовать значение типа 'UITableViewHeaderFooterView?' ввести 'HeaderViewTableViewCell' в принудительном порядке Есть ли способ привести headerView к моему пользовательскому типу?

1 Ответ

0 голосов
/ 15 мая 2018

Прежде всего, я предлагаю вам использовать UITableViewHeaderFooterView для просмотра заголовка.Вы можете сделать подкласс и добавить собственный код.В этом примере я буду использовать пустой подкласс:

class HeaderView: UITableViewHeaderFooterView {
    override func prepareForReuse() {
        super.prepareForReuse()

        // set you default color (other properties) here.
        // when scrolling fast the view gets reused and sometimes
        // the view that's on top will suddenly appear on the bottom still with the previous values
        textLabel?.textColor = .black
    }
}

Зарегистрировать представление вашего заголовка (я пропускаю весь другой не связанный код):

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.register(HeaderView.self, forHeaderFooterViewReuseIdentifier: "Header")

    // If you have a nib file for your HeaderView then register nib instead
    // Make sure in our nib file you set class name to HeaderView
    // And the file name is also HeaderView.xib
    // tableView.register(UINib.init(nibName: "HeaderView", bundle: nil) , forHeaderFooterViewReuseIdentifier: "Header")

}

Реализация методов делегата:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 44
}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let view = tableView.dequeueReusableHeaderFooterView(withIdentifier: "Header")
    view?.textLabel?.text = "Hello"
    return view
}

Создайте метод для обновления заголовков:

// Iterates through section header views and 
// checks for positions in relation to the tableview offset
func updateHeaders() {
    var sectionHeaders: [Int: HeaderView?] = [:]

    var i = 0
    while i < numberOfSections {
        sectionHeaders[i] = tableView.headerView(forSection: i) as? HeaderView
        i += 1
    }

    let availableHeaders = sectionHeaders.flatMap { $0.value != nil ? $0 : nil }
    for (index, header) in availableHeaders {
        let rect = tableView.rectForHeader(inSection: index)

        if rect.origin.y <=  tableView.contentOffset.y + tableView.contentInset.top || index == 0 {
            header!.textLabel?.textColor = .red
        } else {
            header!.textLabel?.textColor = .black
        }
    }
}

И вызовите ваш updateHeaders() из метода UIScrollViewDelegate scrollViewDidScroll:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    updateHeaders()
} 

Также обновите заголовки до того, как представление будетотображаться (до появления прокрутки), для этого используйте метод UITableViewDelegate willDisplayHeaderView:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    updateHeaders()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...