iosswiftuiviewtransformcgaffinetransform

How to apply multiple transforms in Swift


I would like to apply multiple transforms to a UIView (or subclass of UIView), such as translate, rotate, and scale. I know that two transforms can be applied with CGAffineTransformConcat, but how do I do it if I have three or more transforms?

I have seen these questions:

but these questions are asking something different, and the given answers just talk about applying two transforms with CGAffineTransformConcat. Also, they use Objective-C rather than Swift.


Solution

  • You can apply multiple transforms by stacking them on top of each other.

    var t = CGAffineTransform.identity
    t = t.translatedBy(x: 100, y: 300)
    t = t.rotated(by: CGFloat.pi / 4)
    t = t.scaledBy(x: -1, y: 2)
    // ... add as many as you want, then apply it to to the view
    imageView.transform = t
    

    Or more compactly (but not necessarily as readable):

    imageView.transform = CGAffineTransform.identity.translatedBy(x: 100, y: 300).rotated(by: CGFloat.pi / 4).scaledBy(x: -1, y: 2)
    

    This series of transforms produces the image on the right:

    enter image description here

    Thanks to this answer for teaching me how to do it.

    Notes

    enter image description here

    See also

    This answer has been tested with Swift 4