Подтвердить что ты не робот

Как вращать 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")    

Я пытаюсь установить оба этих свойства, но я не уверен, что это правильно.

Я установил опорную точку много, а также пробовал общую центральную точку представления.

4b9b3361

Ответ 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()
        })

    }


}


Результат

введите описание изображения здесь