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.
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:
Merci à cette réponse pour m'avoir appris à le faire.
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)
Cette réponse a été testée avec Swift 4
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)