Анимация UIView всегда идет вверху слева, даже когда центр находится где-то еще - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь оживить UIView, сжимаясь и перемещаясь в другую центральную точку. Он запускается, когда пользователь касается определенного UICollectionViewCell, создается новый UIView, центрированный в ячейке, и начинает расширяться, пока не заполнит весь экран. Это отлично работает. Я сохраняю исходную центральную точку ячейки в новом UIView (пользовательский класс со свойством originCenter).

        let expandingCellView = SlideOverView(frame: cell.bounds)
        expandingCellView.center = collectionView.convert(cell.center, to: self)
        expandingCellView.textLabel.text = cell.textLabel.text
        expandingCellView.originWidth = cell.bounds.width
        expandingCellView.originHeight = cell.bounds.height
        expandingCellView.originCenter = self.convert(expandingCellView.center, to: self)
        expandingCellView.originView = self
        self.addSubview(expandingCellView)

        expandingCellView.widthConstraint.constant = self.frame.width
        expandingCellView.heightConstraint.constant = self.frame.height

        UIView.animate(withDuration: 0.3, animations: {
            expandingCellView.center = self.center
            expandingCellView.layoutIfNeeded()
        })

Этот код работает отлично. Теперь я добавил кнопку в это расширенное представление, которое выполняет следующий код:

        widthConstraint.constant = originWidth
        heightConstraint.constant = originHeight
        print(self.convert(self.originCenter, to: nil))

        UIView.animate(withDuration: 0.5, animations: {
            self.center = self.convert(self.originCenter, to: nil)
            self.layoutIfNeeded()
        }, completion: { (done) in
//            self.removeFromSuperview()
        })

Сжатие представления до его исходного размера работает нормально. Единственное, что не работает - это центрирование. Я беру исходную центральную точку ячейки и преобразовываю ее в эту систему координат видов. Это дает координаты, которые я считаю правильными. Однако все виды просто перемещаются в верхний левый угол экрана.

Ниже приведена ссылка на экран записи. Первый UIView печатает свою новую центральную точку как (208.75, 411.75), а второй открытый UIView I печатает свой центр как (567.25, 411.75). Эти значения кажутся мне правильными, однако они не перемещаются к этой точке, как вы можете видеть на видео. В любом случае, как это можно исправить?

Даже при установке нового центра, например, CGPoint(x: 500, y: 500), представление по-прежнему перемещается в x = 149,5 и y = 149,5

Видео: https://streamable.com/pxemc

1 Ответ

0 голосов
/ 13 марта 2020

Создать var, который имеет weak ссылку на ячейку

weak var selectedCell: UICollectionViewCell!

назначить выбранную ячейку в CollectionView делегат didSelectItemAt вызов

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    selectedCell = collectionView.cellForItemAtIndexPath(indexPath)
}

после добавьте expandingCellView в качестве подпредставления, чтобы сделать его go от размера ячейки до полного экрана

// make expanding view the same size as cell
expandingCellView.frame = selectedCell.frame

// animate
UIView.animate(withDuration: 0.5, animations: {
    self.expandingCellView.layoutIfNeeded()
    self.expandingCellView.frame = self.view.frame
}, completion: { (_) in
    self.expandingCellView.layoutIfNeeded()
})

просто поверните его, чтобы сделать его снова маленьким, как размер ячейки

// animate
UIView.animate(withDuration: 0.5, animations: {
    self.expandingCellView.layoutIfNeeded()
    self.expandingCellView.frame = self.selectedCell.frame
}, completion: { (_) in
    self.expandingCellView.layoutIfNeeded()
})

frame использовать глобальную позицию.

кадр против границ

...