Как вращать UIView вокруг его надлежащего центра без искажений/перекосов
Я создал свой собственный движок анимации, и я хочу установить поворот представления пользовательского интерфейса для каждого кадра, который я визуализую (60 кадров в секунду)
Я сейчас сделал видео, показывающее, в чем проблема.
Он довольно близко, но он все еще вращается странным образом:
https://www.youtube.com/watch?v=1ZKK4r0-6i4
Я реализовал пользовательский класс CustomUIView, который наследуется от представления пользовательского интерфейса. Это имеет свойства трансляции, масштабирования и вращения, поэтому, когда я преобразую матрицу, все 3 происходят в одном и том же действии.
var t = CGAffineTransform( translationX: self.translation.x, y:
self.translation.y );
// Apply scaling
t = t.scaledBy( x: self.scaling.x, y: self.scaling.y );
// Apply rotation
t = t.rotated(by:self.rotation)
self.transform = t
и размер и ширина устанавливаются следующим образом:
view.frame.size.width = parseSize(value, axis: "width")
view.layer.bounds.size.width = parseSize(value, axis: "width")
Я пытаюсь установить оба этих свойства, но я не уверен, что это правильно.
Я установил опорную точку много, а также пробовал общую центральную точку представления.
Ответы
Ответ 1
Проблема заключалась в том, что я устанавливал преобразование более одного раза на анимационный кадр. Это вызывало комплексный эффект с разными значениями. Вам нужно организовать переменные, чтобы вы только устанавливали преобразование один раз во время модификаций свойств.
Ответ 2
Вместо использования
var t = CGAffineTransform( translationX: self.translation.x, y:
self.translation.y );
использовать
var t = CGAffineTransform(rotationAngle: CGFloat(Double.pi*self.rotation/180.0))
это повернет ваш взгляд из центра без изменения их положения.
Ответ 3
Это поможет вам сделать работу в соответствии с вашим требованием:
@IBOutlet var scaleRotateImage: UIImageView!
func scaleNTransform() -> Void {
scaleRotateImage.layer.cornerRadius = scaleRotateImage.frame.size.height/2.0
scaleRotateImage.clipsToBounds = true
let scaleTransform = CGAffineTransform(scaleX: 3.0, y: 3.0) // Scale
let rotateTransform = CGAffineTransform(rotationAngle: CGFloat.pi) // Rotation
let hybridTransform = scaleTransform.concatenating(rotateTransform) // Both Scale + Rotation
// Outer block of animation
UIView.animate(withDuration: 5.0, animations: {
self.scaleRotateImage.transform = scaleTransform
self.view.layoutIfNeeded()
}) { (isCompleted) in
// Nested block of animation
UIView.animate(withDuration: 5.0, animations: {
self.scaleRotateImage.transform = hybridTransform
self.view.layoutIfNeeded()
})
}
}
Результат
![введите описание изображения здесь]()