首页 > 解决方案 > 使用动画更改 CollectionView 位置,但在第一次滚动时向后移动

问题描述

我想collectionView在按下按钮时改变我的位置。collectionView我将and包裹Button在 a 中View,并使用 UIView animate 使其向上移动。它可以成功向上移动,但是当我滚动它时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()
    }
}

标签: iosswiftanimationuicollectionview

解决方案


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

发生此问题是因为我更改的框架与我之前在情节提要中设置的自动布局冲突。根据文档,我必须将 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
        }
    }
}

推荐阅读