Сначала давайте определим, что мы подразумеваем под «без прокрутки» - мы имеем в виду, что клетки, более или менее, остаются неизменными.Итак, мы хотим найти ячейку, которой хотим быть якорной.До и после изменений расстояния от верха ячейки до верха экрана одинаковы.
var indexPathAnchorPoint:IndexPath?
var offsetAnchorPoint:CGFloat?
func findHighestCellThatStartsInFrame() -> UITableViewCell? {
var anchorCell:UITableViewCell?
for cell in self.tableView.visibleCells {
let topIsInFrame = cell.frame.origin.y >= self.tableView.contentOffset.y
if topIsInFrame {
if let currentlySelected = anchorCell{
let isHigerUpInView = cell.frame.origin.y < currentlySelected.frame.origin.y
if isHigerUpInView {
anchorCell = cell
}
}else{
anchorCell = cell
}
}
}
return anchorCell
}
func setAnchorPoint() {
self.indexPathAnchorPoint = nil;
self.offsetAnchorPoint = nil;
if let cell = self.findHighestCellThatStartsInFrame() {
self.offsetAnchorPoint = cell.frame.origin.y - self.tableView.contentOffset.y
self.indexPathAnchorPoint = self.tableView.indexPath(for: cell)
}
}
мы вызываем это, прежде чем начать что-то делать.
func bubbleTappedHandler(sender: UITapGestureRecognizer) {
self.setAnchorPoint()
....
Затем нам нужно установить смещение содержимого после того, как мы делаем наши изменения, чтобы ячейка возвращалась туда, где она должна быть.
func scrollToAnchorPoint() {
if let indexPath = indexPathAnchorPoint, let offset = offsetAnchorPoint {
let rect = self.tableView.rectForRow(at: indexPath)
let contentOffset = rect.origin.y - offset
self.tableView.setContentOffset(CGPoint.init(x: 0, y: contentOffset), animated: false)
}
}
Далее мы вызываем еепосле того, как мы закончим делать наши изменения.
self.tableView.beginUpdates()
self.tableView.endUpdates()
self.tableView.layoutSubviews()
self.scrollToAnchorPoint()
Анимация может быть немного странной, потому что в то же время происходит много всего.Мы одновременно изменяем смещение содержимого и размеры ячейки, но если вы поместите палец рядом с первой ячейкой, которая видна сверху, вы увидите, что она оказывается в правильном месте.