web-dev-qa-db-fra.com

Comment appliquer plusieurs transformations dans Swift

Je voudrais appliquer plusieurs transformations à un UIView (ou à une sous-classe de UIView), tel que translater, faire pivoter et mettre à l'échelle. Je sais que deux transformations peuvent être appliquées avec CGAffineTransformConcat , mais comment puis-je le faire si j'ai trois transformations ou plus?

J'ai vu ces questions:

mais ces questions demandent quelque chose de différent, et les réponses données parlent simplement d'appliquer deux transformations avec CGAffineTransformConcat. En outre, ils utilisent Objective-C plutôt que Swift.

49
Suragch

Vous pouvez appliquer plusieurs transformations en les empilant les unes sur les autres.

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

Ou plus compactement (mais pas nécessairement aussi lisible):

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

Cette série de transformations produit l'image de droite:

enter image description here

Merci à cette réponse pour m'avoir appris à le faire.

Remarques

  • L'ordre dans lequel vous appliquez les transformations est important. Par exemple, si les transformations étaient effectuées dans l'ordre inverse, le résultat suivant serait obtenu.

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

enter image description here

Voir également

Cette réponse a été testée avec Swift 4

116
Suragch

Dans Swift 3, elles ont été remplacées par des fonctions sur CGAffineTransform lui-même, qui peuvent être chaînées.

extension CGAffineTransform {
    public func translatedBy(x tx: CGFloat, y ty: CGFloat) -> CGAffineTransform
    public func scaledBy(x sx: CGFloat, y sy: CGFloat) -> CGAffineTransform
    public func rotated(by angle: CGFloat) -> CGAffineTransform
}

donc par exemple

let transform = CGAffineTransform(scaleX: 1.0, y: 3.0).translatedBy(x: 12, y: 9).rotated(by: 17.0)
26
Tyler Sheaffer