使用动画更改 CollectionView 位置,但在第一次滚动时向后移动

Posted

技术标签:

【中文标题】使用动画更改 CollectionView 位置,但在第一次滚动时向后移动【英文标题】:Change CollectionView position with animation but move back when first scroll 【发布时间】:2018-07-02 06:14:36 【问题描述】:

我想在按下按钮时更改我的collectionView 位置。我将collectionViewButton 包裹在View 中,并使用UIView 动画使其向上移动。它可以成功向上移动,但是当我滚动collectionView 时,它会返回到原来的位置。如果我尝试了很多次,它就会变得正常,并且不会再次移动。

我该如何解决这个问题?谢谢你的建议。

func openPreview() 
    if !isPreviewOpened 
        UIView.animate(withDuration: 0.3) 
            self.previewView.frame.origin.y -= self.previewView.frame.height
            self.previewButton.frame.origin.y -= self.previewView.frame.height
        
        isPreviewOpened = true
        updateUI()
    

func closePreview() 
    if isPreviewOpened 
        UIView.animate(withDuration: 0.3) 
            self.previewView.frame.origin.y += self.previewView.frame.height
            self.previewButton.frame.origin.y += self.previewView.frame.height
        
        isPreviewOpened = false
        updateUI()
    

【问题讨论】:

【参考方案1】:

在问过其他人之后,提供我对这个问题的解决方案,希望它可以帮助将来的人。

发生此问题是因为我更改的框架与我之前在情节提要中设置的自动布局冲突。根据文档,我必须将 translatesAutoresizingMaskIntoConstraints 设置为 true 才能跟踪帧。

默认情况下,视图上的自动调整掩码会产生完全确定的约束 视图的位置。这允许自动布局系统跟踪其视图的框架 布局是手动控制的(例如,通过 -setFrame:)。 当您选择通过添加自己的约束来使用自动布局定位视图时, 您必须将此属性设置为 NO。 IB会为你做这件事。

这就是答案。

func openPreview() 
    if !isPreviewOpened 
        previewView.translatesAutoresizingMaskIntoConstraints = true
        UIView.animate(withDuration: 0.3) 
            self.previewView.frame.origin.y = self.view.bounds.maxY - self.previewView.frame.height
            self.previewButton.frame.origin.y = self.view.bounds.maxY - self.previewView.frame.height - self.previewButton.frame.height
        
    

【讨论】:

以上是关于使用动画更改 CollectionView 位置,但在第一次滚动时向后移动的主要内容,如果未能解决你的问题,请参考以下文章

Apple Photos collectionview 捏缩放如何工作?

自定义布局中约束更改的动画 UICollectionView 项目

如何在运行时更改集合视图标题中的标签文本位置?

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

简单的collectionView动画

如何使用 css3 动画更改背景位置?