странная анимация tableView при использовании функции вставки - PullRequest
1 голос
/ 14 апреля 2019

Я пытаюсь вставить еще несколько ячеек в табличное представление, когда пользователь достигает нижней части таблицы.вставка работает нормально, но при прокрутке происходит странная анимация.

Я пытался добавить beginUpdates() и endUpdates() до и после метода insert().но это не помоглоЯ попытался добавить tableView.contentInsetAdjustmentBehavior = .never в viewDidLoad, и это не помогло.

код, который я пробовал:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        if tableView.contentOffset.y >= (tableView.contentSize.height - tableView.frame.size.height) {
            loadMoreCells()
        }

func loadMoreCells() {
       ServerRequests.getDataServerRequest(id: provider.ID, page: page) { (foundEpisodes) in
            if foundEpisodes.count > 0 {
                let previous = self.episodes.count
                self.episodes.insert(contentsOf: foundEpisodes, at: self.episodes.count)
                self.isViewOpen.insert(contentsOf: [Bool](repeatElement(false, count: foundEpisodes.count)), at: self.isViewOpen.count)
                var indexPathsToBeInserted = [IndexPath]()
                for i in previous..<self.episodes.count{
                    indexPathsToBeInserted.append(IndexPath(row: i, section: 0))
                }
                self.tableView.insertRows(at: indexPathsToBeInserted, with: UITableViewRowAnimation.none)
            }
        }
    }

Я вызываю вставку не в том месте?или что я не так делаю?

ОБНОВЛЕНИЕ

в viewDidLoad:

tableView.register(UINib(nibName: NIB_NAME, bundle: nil), forCellReuseIdentifier: NIB_IDENTIFIRE)

в cellForRow:

let cell = tableView.dequeueReusableCell(withIdentifier: NIB_IDENTIFIRE, for: indexPath) as! EpisodePerProviderTableViewCell
    cell.setUpCell(tableView: tableView, episode: episodes[indexPath.row], indexPath: indexPath, isViewOpen: isViewOpen)

    return cell

функция setUpCell:

unc setUpCell(tableView: UITableView, episode: Episode, indexPath: IndexPath, isViewOpen: [Bool]) {
    isMenuVisible = false
    menuView.isHidden = true
    if (isViewOpen[indexPath.row]){
        descriptionLabel.numberOfLines = 100
        moreLessLabel.text = "Less"
    }else{
        descriptionLabel.numberOfLines = 2
        moreLessLabel.text = "More"
    }
    tableView.beginUpdates()
    tableView.endUpdates()

    self.isViewOpen = isViewOpen
    self.indexPath = indexPath
    self.tableView = tableView
    self.episode = episode
    arrowButton.transform = .identity

    //set up cell content
    if let myDate = dateFormatter.date(from: episode.episodePostDate) {
        postedDate.text = dateFormatter.timeSince(from: myDate as NSDate)
    }
    episodeImage.windless.start()
    episodeImage.sd_setImage(with: URL(string: episode.episodeImageUrl ?? ""), placeholderImage: UIImage(named: "FalloundPlayerLogo")) { (providerImage, error, SDImageCacheType, url) in
        self.episodeImage.windless.end()
    }
    title.text = episode.episodeName
    durationLabel.text = "".formatted(time: Float(episode.episodeDuration), withoutSec: true)
    descriptionLabel.text = episode.episodeDescription
}

Ответы [ 2 ]

2 голосов
/ 14 апреля 2019

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

попробуйте использовать эту проверку вместо willDisplay:

if indexPath.row == yourArrayOfCells.count - 1{
    loadMoreCells()
}

UPDATE

Итак, у меня есть кое-что о той же проблеме, после некоторого поиска я нашел это решение для себя:

//conform to UIScrollViewDelegate

let threshold : CGFloat = 10.0 // threshold from bottom of tableView
var isLoadingMore = false //checks if API session ended

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let contentOffset = scrollView.contentOffset.y
    let maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height;

    if !isLoadingMore && (maximumOffset - contentOffset) <= threshold {

        self.isLoadingMore = true
        DispatchQueue.main.async {
            loadMoreCells() 
            self.isLoadingMore = false
        }
    }
}

Если запрос API происходит слишком быстро и загрузка выглядит забавно, вы можете добавить задержку:

        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            loadMoreCells() 
            self.isLoadingMore = false
        }

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

ОБНОВЛЕНИЕ-2

Те2 функции в setUpCell () не являются необходимыми:

tableView.beginUpdates()
tableView.endUpdates()
0 голосов
/ 14 апреля 2019

Надеюсь, это поможет.

UIView.setAnimationsEnabled(false)
self.tableView.beginUpdates()

self.tableView.insertRows(at: indexPathsToBeInserted, with: UITableViewRowAnimation.none)

self.tableView.endUpdates()
UIView.setAnimationsEnabled(true)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...