Как применить преобразование к UILabel перед анимацией в Swift? - PullRequest
0 голосов
/ 13 декабря 2018

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

label.transform = CGAffineTransform(rotationAngle: CGFloat(90.0 * .pi / 180))

animateLabel(label:label)

func animateLabel(label:UILabel) {

    label.transform = CGAffineTransform(scaleX: 0.6, y: 0.6)

    UIView.animate(withDuration: 0.2, animations: {
        label.transform = CGAffineTransform(scaleX: 1.1, y: 1.1)
    },
    completion: { _ in
        UIView.animate(withDuration: 0.1) {
            label.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)

        }
    })

}

Обновление : Как я обновил свой код ответом Мэтта, чтобы он правильно анимировался:

Сначала я устанавливаю начальное вращение как переменную преобразования, а затем отправляю его при вызове animateLabel:

var transforms: CGAffineTransform = .identity

transforms = transforms.concatenating(CGAffineTransform(rotationAngle: CGFloat(90.0 * .pi / 180)))

animateLabel(label:label, transforms:transforms)

Я согласовываю масштаб и устанавливаю преобразование в измененное преобразование.Затем я могу использовать масштабирование для реальной анимации:

func animateLabel(label:UILabel, transforms:CGAffineTransform) {

    transforms.concatenating(CGAffineTransform(scaleX: 0.6, y: 0.6))

    label.transform = transforms

    UIView.animate(withDuration: 0.2, animations: {
        label.transform = transforms.scaledBy(x: 1.1, y: 1.1)
    },
    completion: { _ in
        UIView.animate(withDuration: 0.1) {
            label.transform = transforms.scaledBy(x: 1.0, y: 1.0)
        }
    })

}

1 Ответ

0 голосов
/ 13 декабря 2018

То, как я это сделал, теперь игнорирует мое начальное вращение вида, если впоследствии у меня есть анимация.

Легко понять, почему.Представление имеет только одно преобразование.Ваше второе преобразование заменяет первое:

label.transform = CGAffineTransform(rotationAngle: CGFloat(90.0 * .pi / 180))
label.transform = CGAffineTransform(scaleX: 0.6, y: 0.6)

Это то, что вы делаете.Вместо этого вам нужно применить второе преобразование в первое.Посмотрите на методы, которые объединяют второе преобразование с первым, вместо полной замены первого.Например, https://developer.apple.com/documentation/coregraphics/cgaffinetransform/1455882-scaledby

Таким образом, я легко смог получить это, что кажется грубым приближением к тому, что вы хотите:

enter image description here

Чтобы получить это, я подготовил два преобразования: вращение и шкала вращения плюс:

    let rot = CGAffineTransform(rotationAngle: CGFloat(90.0 * .pi / 180))
    let scale = rot.scaledBy(x: 1.5, y: 1.5)
...