it-swarm.com.ru

UITableview прокручивает вверх при перезагрузке

У меня проблема с приложением - вы можете публиковать и редактировать ваши любимые места. После публикации сообщения или редактирования определенного сообщения (UITableViewCell), UITableview перезагружается.

Моя проблема: UITableview прокручивается наверх после перезагрузки. Но это не то, что я хочу. Я хочу, чтобы мой взгляд оставался на камере/вид, где я был. Но я не знаю, как с этим справиться. 

Не могли бы вы помочь мне?

14
debbiedowner

Игорь ответ правильный, если вы используете динамически изменяемые размеры ячеек (UITableViewAutomaticDimension)

Вот это в Swift 3:

    private var cellHeights: [IndexPath: CGFloat?] = [:]
    var expandedIndexPaths: [IndexPath] = []

    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        cellHeights[indexPath] = cell.frame.height
    }

    func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        if let height = cellHeights[indexPath] {
            return height ?? UITableViewAutomaticDimension
        }
        return UITableViewAutomaticDimension
    }


    func expandCell(cell: UITableViewCell) {
      if let indexPath = tableView.indexPath(for: cell) {
        if !expandedIndexPaths.contains(indexPath) {
            expandedIndexPaths.append(indexPath)
            cellHeights[indexPath] = nil
            tableView.reloadRows(at: [indexPath], with: UITableViewRowAnimation.automatic)
            //tableView.scrollToRow(at: indexPath, at: .top, animated: true)
        }
      }
    }
22
Kurt J

Чтобы предотвратить прокрутку вверх, вы должны сохранять высоты ячеек при их загрузке и указывать точное значение в tableView:estimatedHeightForRowAtIndexPath:

// declare cellHeightsDictionary
NSMutableDictionary *cellHeightsDictionary;

// initialize it in ViewDidLoad or other place
cellHeightsDictionary = @{}.mutableCopy;

// save height
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    [cellHeightsDictionary setObject:@(cell.frame.size.height) forKey:indexPath];
}

// give exact height value
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSNumber *height = [cellHeightsDictionary objectForKey:indexPath];
    if (height) return height.doubleValue;
    return UITableViewAutomaticDimension;
}
15
Igor

Метод UITableView's reloadData() явно является принудительной перезагрузкой всего tableView. Это работает хорошо, но обычно раздражает и плохо взаимодействует с пользователем, если вы собираетесь делать это с табличным представлением, на которое в данный момент смотрит пользователь.

Вместо этого взгляните на reloadRowsAtIndexPaths(_:withRowAnimation:) и reloadSections(_:withRowAnimation:)в документации .

11
SpacyRicochet

Просто зайдите на эти строки, если вы хотите простое решение

    let contentOffset = tableView.contentOffset
    tableView.reloadData()
    tableView.setContentOffset(contentOffset, animated: false)
4
zeiteisen

В Swift 3.1

DispatchQueue.main.async(execute: {

    self.TableView.reloadData()
    self.TableView.contentOffset = .zero

})
1
Mahipalsinh