насколько я помню общий подход был такой: мы берем какой-нибудь видимый элемент на экране, например первую ячейку из visibleCells, запоминаем ее frame и contentOffset для этого фрейма (типа ее смещение относительно фрейма), затем делаем модификации, снова берем эту ячейку (хотя она может быть уже вообще уехала за экран) и выставляем оффсет таким образом чтобы она снова была видна со смещением которое мы вычислили