Измените положение CollectionView с анимацией, но вернитесь назад при первой прокрутке - PullRequest
0 голосов
/ 02 июля 2018

Я хочу изменить свою позицию collectionView при нажатии кнопки. Я обернул collectionView и Button в 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 Ответ

0 голосов
/ 03 июля 2018

Спросив других, предоставьте свое решение по этому вопросу, надеюсь, что это поможет кому-то в будущем.

Эта проблема возникла из-за того, что кадр, который я изменил, конфликтует с автоматическим макетом, который я установил ранее в раскадровке. Согласно документу, я должен установить для 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
        }
    }
}
...