2015-06-19 4 views
26

Ich möchte mehrere Transformationen auf eine UIView (oder Unterklasse von UIView), wie übersetzen, drehen und skalieren anwenden. Ich weiß, dass zwei Transformationen mit CGAffineTransformConcat angewendet werden können, aber wie mache ich es, wenn ich drei oder mehr Transformationen habe?Wie man mehrere Transformationen in Swift anwendet

ich diese Fragen haben gesehen:

aber diese Fragen stellen etwas anderes, und die gegebenen Antworten über die Anwendung von zwei Transformationen mit CGAffineTransformConcat nur reden. Außerdem verwenden sie Objective-C anstelle von Swift.

Antwort

73

Sie können mehrere Transformationen anwenden, indem Sie sie aufeinander stapeln.

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 

Oder kompakter (aber nicht unbedingt so lesbar):

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

Diese Reihe von Transformationen auf der rechten Seite das Bild erzeugt:

enter image description here

Dank this answer für den Unterricht ich, wie es geht.

Hinweise

  • Die Reihenfolge, in der die Transformationen Sachen. Wenn die Transformationen beispielsweise in der umgekehrten Reihenfolge ausgeführt würden, würde dies zu folgendem Ergebnis führen.

    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

Siehe auch

Diese Antwort mit Swift 4 wurde getestet

+0

Haben Sie über "Die Ordnung Angelegenheiten" mind darlegen? Ich weiß, dass es mehr als 2 Jahre her ist, seit du geantwortet hast. –

+1

@ClayEllis, siehe mein Update – Suragch

13

In Swift 3, wurden diese durch Funktionen auf CGAffineTransform selbst ersetzt, die verkettet werden können.

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 
} 

so zum Beispiel

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