CollectionView 在动画期间切断单元格

Posted

技术标签:

【中文标题】CollectionView 在动画期间切断单元格【英文标题】:CollectionView cuts off cells during animation 【发布时间】:2019-03-21 21:20:02 【问题描述】:

所以我有一个collectionView,它锚定到我的viewController 中的另一个子视图。橙色子视图锚定在导航栏的底部,它的高度和 alpha 值被动画化。

当它的动画时,collecitonView 在动画期间向下移动。虽然,正如您将看到的,一些较低的单元格在动画之前消失,使其看起来不平滑和锯齿状。

这是设置viewController的子视图的函数:

private func setupSubviews() 
    view.addSubview(newMessageView)
    NSLayoutConstraint.activate([
        newMessageView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
        newMessageView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        newMessageView.trailingAnchor.constraint(equalTo: view.trailingAnchor)
        ])
    newMessageView.heightConstraint = newMessageView.heightAnchor.constraint(equalToConstant: 0)
    newMessageView.heightConstraint?.isActive = true


    view.addSubview(messagesCollectionView)
    messagesCollectionView.anchor(top: newMessageView.bottomAnchor, leading: view.leadingAnchor, bottom: view.bottomAnchor, trailing: view.trailingAnchor)

这是被调用的函数:

@objc func newMessage() 

toggleHeader = !toggleHeader

UIView.animate(withDuration: 1.0, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseInOut, animations: 

    if (self.toggleHeader) 
        self.newMessageView.heightConstraint?.constant = 200
     else 
        self.newMessageView.heightConstraint?.constant = 0
    

    self.view.layoutIfNeeded()
)

我只是更改了我施加的 heightConstraint。我相信它与 didEndDisplaying 函数有关,该函数检测到单元格不可见并将其切断。

我将如何改变或改进这一点?或者有没有办法阻止 collectionView 删除未显示的单元格?

谢谢

【问题讨论】:

请分享你的代码 好的。我已经更新了。 【参考方案1】:

没关系。修复。

将 collectionView 的底部锚点更改为 view.safeAreaLayoutGuide.bottomAnchor。

【讨论】:

我正要说(:实际上认为你应该在 messagesCollectionView 上添加 setLayoutIfNeeded,但如果它像这样工作那么完美

以上是关于CollectionView 在动画期间切断单元格的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CollectionView 单元格上添加过渡动画?

为啥我的 collectionview 单元格没有动画?

当它从一个 collectionView 移动到另一个时,如何实现单元格动画?

如何仅为一个 indexPath.row 项目在 CollectionView 单元格中设置动画?

如何快速裁剪collectionview单元格之外的部分图像

如果 UIView 动画在单元格上运行,则不会调用 CollectionView didSelectItemAtIndexPath