使用插入功能时奇怪的tableView动画
Posted
技术标签:
【中文标题】使用插入功能时奇怪的tableView动画【英文标题】:weird tableView animation when using insert function 【发布时间】:2019-04-14 10:20:03 【问题描述】:当用户到达表格底部时,我正在尝试在表格视图中插入更多单元格。插入工作正常,但是向上滚动时会发生奇怪的动画。
我尝试在insert()
方法之前和之后添加beginUpdates()
和endUpdates()
。但这没有帮助。我尝试在viewDidLoad
中添加tableView.contentInsetAdjustmentBehavior = .never
,但没有帮助。
我试过的代码是:
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
【问题讨论】:
你能解释一下你希望什么时候调用 loadMoreCells() 吗? @VadimF。当用户到达表格底部时,或者换句话说,当最后一个单元格被加载时。 【参考方案1】:我认为问题是因为 loadMoreCells 被调用了太多次。
尝试使用此检查而不是 willDisplay:
if indexPath.row == yourArrayOfCells.count - 1
loadMoreCells()
更新
所以我有一些相同的问题,经过一番挖掘后,我为自己找到了这个解决方案:
//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
如果它不起作用,我会假设问题不在您提供的代码中。
UPDATE-2
setUpCell() 中的这 2 个函数不是必需的:
tableView.beginUpdates()
tableView.endUpdates()
【讨论】:
还是没有解决问题。其余的代码非常简单。但是如果你想看更多,我会在这里添加它 @mahdi 请做,如果你有 Github 的链接就更好了 @mahdi 只是为了确保您确实尝试将 willDisplay 函数更改为 scrollViewDidScroll ? @mahdi 从我看到你在设置每个单元格时下载图像? 是的,但我试图注释掉这行代码。没有任何改变。【参考方案2】:希望这会有所帮助。
UIView.setAnimationsEnabled(false)
self.tableView.beginUpdates()
self.tableView.insertRows(at: indexPathsToBeInserted, with: UITableViewRowAnimation.none)
self.tableView.endUpdates()
UIView.setAnimationsEnabled(true)
【讨论】:
以上是关于使用插入功能时奇怪的tableView动画的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionView(插入和删除项目)的奇怪动画行为[关闭]