Swift - Как сделать эффект сокращения ячейки при нажатии в UICollectionView (например, приложение ios 12 Shortcut и приложение App Store) - PullRequest
0 голосов
/ 04 октября 2018

Я думаю, что способ реализовать это будет использовать UIView.animate (...).Но часть, которая застряла, - это то, как добавить распознаватель жестов для обнаружения касаний.Я попытался использовать UILongPressGestureRecognizer, но это приводит к тому, что пользователь не может прокручивать ячейки.Любая помощь здесь будет принята с благодарностью.

Позвольте мне объяснить мой вопрос более четко, так как некоторые пользователи здесь дали мне неуместные ответы.Пожалуйста, обратитесь к IOS 12 ShortCut App и увидите эффект сокращения ячеек, когда пользователи прокручивают ячейки во вкладке галереи

Ниже приведена моя попытка сделать анимацию в функции didHighlight.Хотя это работает, существует небольшая задержка между нажатием на ячейку и началом анимации ячейки (примерно от 0,1 до 0,3 с), в отличие от приложения ShortCut, где ячейка сжимается почти мгновенно и чувствует себя более естественной

    func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath) {
    let cell = collectionView.cellForItem(at: indexPath)
    UIView.animate(withDuration: 0.1) {
        cell?.transform = CGAffineTransform(scaleX: 0.95, y: 0.95)
    }
}

func collectionView(_ collectionView: UICollectionView, didUnhighlightItemAt indexPath: IndexPath) {
    let cell = collectionView.cellForItem(at: indexPath)
    UIView.animate(withDuration: 0.1) {
        cell?.transform = CGAffineTransform(scaleX: 1, y: 1)
    }
}

1 Ответ

0 голосов
/ 04 октября 2018

Я сделал нечто подобное, но поместил анимацию в метод didSelectItemAt:, а не в методы выделения.Я перехожу к другому представлению и поэтому помещаю переход в завершенную часть закрытия.

UIView.animate(withDuration: 0.1, delay: 0, options: [.curveEaseOut], animations: {
            cell.transform = CGAffineTransform(scaleX: 0.95, y: 0.95)
        }) { finished in
            UIView.animate(withDuration: 0.1, delay: 0, options: [.curveEaseIn], animations: {
                cell.transform = CGAffineTransform.identity
            }) { finished in
                self.performSegue(withIdentifier: "YOUR-SEGUE-HERE", sender: indexPath)
            }
        }

РЕДАКТИРОВАТЬ: Извинения.Я думаю, что я читал то, что хотел прочитать.Я взглянул на приложение и думаю, что вам нужно сделать что-то вроде захвата касаний, вставив следующее в ваш подкласс UICollectionViewCell.Очевидно, вам нужно изменить вещи для вашего конкретного случая использования.

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    UIView.animate(withDuration: 0.1) {
        self.transform = CGAffineTransform(scaleX: 0.9, y: 0.9)
    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    UIView.animate(withDuration: 0.1) {
        self.transform = CGAffineTransform(scaleX: 1, y: 1)
    }
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    UIView.animate(withDuration: 0.1) {
        self.transform = CGAffineTransform(scaleX: 1, y: 1)
    }
}
...