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

UIView.animate(withDuration: 1.0, animations: {
        self.imgView.transform = self.imgView.transform.concatenating(CGAffineTransform(rotationAngle: CGFloat.pi/180*5))
    }, completion: nil)

Я нашел многообещающий вариант в варианте функции анимации, но от этого он выглядит еще хуже (как-то даже искажает изображение):

UIView.animate(withDuration: 1.0, delay: 0.0, options: .beginFromCurrentState, animations: {
        self.imgView.transform = self.imgView.transform.concatenating(CGAffineTransform(rotationAngle: CGFloat.pi/180*5))
    }, completion: nil)

Что я делаю не так?

Кстати, у представления изначально есть масштаб и преобразование на нем, которое устанавливается один раз в viewDidLoad:

        imgView.frame = CGRect(x: 0, y: view.frame.maxY-view.frame.midX, width: view.frame.maxX, height: view.frame.maxX)
    imgView.transform = CGAffineTransform.identity.scaledBy(x: 14, y: 14).translatedBy(x: 0, y: 150)

Упоминаю об этом на всякий случай, если проблема как-то связана с этой штукой.

0
wicketeer 11 Окт 2019 в 12:52

2 ответа

Увеличивайте угол каждый раз, когда вы вызываете преобразование

angel = angel + 0.5
self.imgView.transform = self.imgView.transform.concatenating(CGAffineTransform(rotationAngle: CGFloat.pi/180* angel))
0
Chris 11 Окт 2019 в 14:12
Это только усугубляет ситуацию :( Затем каждый раз он снова возвращается к началу и вращается все больше и больше. Исходная версия была в порядке в том, что она вращалась в правильное место, однако всегда это происходило путем возврата к исходному углу, затем анимацию до нужного. Мне нужно, чтобы он начал с того места, где был. Все остальное работает.
 – 
wicketeer
11 Окт 2019 в 15:48

Я нашел проблему. Это исходный файл TranslatedBy. Если я вытащу это, все работает отлично. Итак, теперь я знаю, что позиционирование представления всегда должно выполняться через фрейм и / или ограничения, а не через translatedBy.

0
wicketeer 15 Окт 2019 в 11:30