Цепная анимация UIView с CGAffineTransform масштабирует и переводит - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь анимировать UIView на игровой площадке, используя animate(withDuration:animations:).Цель состоит в том, чтобы переместить представление вниз, а затем переместить его вправо и одновременно увеличить его.

Итак, я делаю это в два этапа, вызывая вторую анимацию после завершения первой.

Вот 3 преобразования, которые я собираюсь применить к своему представлению

let scaleUp = CGAffineTransform(scaleX: 2, y: 2)
let moveDown = CGAffineTransform(translationX: 0, y: 100)
let moveRight = CGAffineTransform(translationX: 100, y: 0)

Чтобы сделать moveDown с последующим moveRight Я соединяю второе с первым.

UIView.animate(withDuration: 2, animations: {
            circleView.transform = moveDown
        }) { _ in
            //First animation completed
            UIView.animate(withDuration: 4, animations: {
                circleView.transform = moveDown.concatenating(moveRight)
            })
        }

transition 1 `


Теперь, когда я пытаюсь увеличить масштаб при перемещении вправо, кажется, что он применяет масштабирование к уже преобразованному виду, чтоприводит к сдвигу всего (2 раза) до начала второй анимации.
UIView.animate(withDuration: 2, animations: {
            circleView.transform = moveDown
        }) { _ in
            //First animation completed
            UIView.animate(withDuration: 2, animations: {
                circleView.transform = moveDown.concatenating(scaleUp.concatenating(moveRight))
            })
        }

enter image description here

Как мне добиться перемещения вправо + масштабировать вверх без сбросамое первоначальное преобразование?

Ответы [ 3 ]

2 голосов
/ 19 сентября 2019

Мое решение больше похоже на оперативное исправление, но это то, что вам нужно:

1 выполнить анимацию преобразования при движении вниз

2 отменить преобразование выше (без анимации)

3 установить circleView в положение, аналогичное преобразованию при перемещении вниз (без анимации)

4 выполнить анимацию движения вправо и увеличить

UIView.animate(withDuration: 2, animations: {
        circleView.transform = moveDown //1
    }) { _ in
        //First animation completed
        circleView.transform = .identity //2
        circleView.frame.origin.y += 100 //3
        UIView.animate(withDuration: 2, animations: {
            circleView.transform = moveRight.concatenating(scaleUp) //4
        })
    }
0 голосов
/ 19 сентября 2019

Я думаю, что ваша проблема уже была решена в этом сообщении .Было сказано, что для достижения вашей цели (две одновременные анимации) вам нужно использовать CAAnimationand и слой addAnimation

Я пробовал это, и это работает

let scaleAA = CABasicAnimation(keyPath: "transform.scale")
scaleAA.fromValue = 1
scaleAA.byValue = 2
scaleAA.duration = 1
scaleAA.timingFunction = CAMediaTimingFunction.init(name: .easeOut)

let scaleXX = CABasicAnimation(keyPath: "position.x")
scaleXX.fromValue = 0
scaleXX.byValue = 20
scaleXX.duration = 1
scaleXX.timingFunction = CAMediaTimingFunction.init(name: .easeOut)

UIView.animate(withDuration: 1, animations: {
    v1.transform = moveDown
}) { _ in
    //First animation completed
    v1.layer.add(scaleAA, forKey: "scale")
    v1.layer.add(scaleXX, forKey: "xxxx")
}
0 голосов
/ 19 сентября 2019

В порядке преобразования, в котором они применяются, я думаю, потому что вы применяете масштабирование до перевода, оно принимает увеличенное значение.

moveRight.concatenating(scaleUp)

может работать нормально.

...