Цвет первой видимой ячейки сверху в UITableView после прокрутки - PullRequest
1 голос
/ 19 апреля 2020

Я хочу, чтобы всегда первая видимая ячейка в моем UITableView имела цвет фона, отличный от других ячеек.

В настоящее время у меня есть это для моего UITableView

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 100
    }

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableViewNew.dequeueReusableCell(withIdentifier: "cellNewPosts", for: indexPath) as! MainNewTableViewCell

    return cell
    }

И это, так что первая ячейка привязана к вершине. Технически, у меня есть строка, которая должна быть цветной (currentItemOnTop):

scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {

    // Vibration Feedback
    let generator = UIImpactFeedbackGenerator(style: .light)
    generator.impactOccurred()

    guard var scrollingToIP = tableViewNew.indexPathForRow(at: CGPoint(x: 0, y: targetContentOffset.pointee.y)) else {
        return
    }

    var scrollingToRect = tableViewNew.rectForRow(at: scrollingToIP)
    let roundingRow = Int(((targetContentOffset.pointee.y - scrollingToRect.origin.y) / scrollingToRect.size.height).rounded())

    scrollingToIP.row += roundingRow
    scrollingToRect = tableViewNew.rectForRow(at: scrollingToIP)
    targetContentOffset.pointee.y = scrollingToRect.origin.y

    currentItemOnTop = scrollingToIP.row

} 

Как мне этого добиться? Я много чего перепробовал, но думаю, что моя проблема в том, что я использую многоразовые клетки.

1 Ответ

0 голосов
/ 19 апреля 2020

Довольно просто, в cellForRow назначить цвет в зависимости от currentItemOnTop

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   let cell = tableViewNew.dequeueReusableCell(withIdentifier: "cellNewPosts", for: indexPath) as! MainNewTableViewCell
   if indexPath.row == currentItemOnTop {
      cell.backgroundColor = .systemRed
   } else {
      cell.backgroundColor = // specify a default color
   }
   return cell
}

В scrollViewWillEndDragging перезагрузить предыдущие и текущие строки после обновления свойства

scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    // Vibration Feedback
    let generator = UIImpactFeedbackGenerator(style: .light)
    generator.impactOccurred()
    guard var scrollingToIP = tableViewNew.indexPathForRow(at: CGPoint(x: 0, y: targetContentOffset.pointee.y)) else {
        return
    }
    var scrollingToRect = tableViewNew.rectForRow(at: scrollingToIP)
    let roundingRow = Int(((targetContentOffset.pointee.y - scrollingToRect.origin.y) / scrollingToRect.size.height).rounded())
    scrollingToIP.row += roundingRow
    scrollingToRect = tableViewNew.rectForRow(at: scrollingToIP)
    targetContentOffset.pointee.y = scrollingToRect.origin.y
    let previousRow = currentItemOnTop
    currentItemOnTop = scrollingToIP.row
    let indexPaths = [IndexPath(row: previousRow, section: 0), IndexPath(row: currentItemOnTop, section: 0)]
    tableView.reloadRows(at: indexPaths, with: .none)

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...