2015-06-19 19 views
26

Vorrei applicare più trasformazioni a UIView (o sottoclasse di UIView), ad esempio tradurre, ruotare e ridimensionare. So che due trasformazioni possono essere applicate con CGAffineTransformConcat, ma come faccio se ho tre o più trasformazioni?Come applicare più trasformazioni in Swift

ho visto queste domande:

ma queste domande stanno chiedendo qualcosa di diverso, e le risposte date solo parlare di applicazione di due trasformazioni con CGAffineTransformConcat. Inoltre, usano Objective-C piuttosto che Swift.

risposta

73

È possibile applicare più trasformazioni sovrapponendole l'una sull'altra.

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 

O, più compatto (ma non necessariamente come leggibile):

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

Questa serie di trasformazioni produce l'immagine sulla destra:

enter image description here

Grazie a this answer per l'insegnamento io come si fa

Note

  • L'ordine in cui si applicano le questioni trasforma. Ad esempio, se le trasformazioni fossero eseguite nell'ordine opposto, produrrebbe il seguente risultato.

    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

Vedi anche

Questa risposta è stato testato con Swift 4

+0

Ti dispiace esporre su "Le materie di ordine"? Mi rendo conto che sono passati 2 anni da quando hai risposto. –

+1

@ClayEllis, vedere il mio aggiornamento – Suragch

13

In Swift 3, questi sono stati sostituiti da funzioni di CGAffineTransform stessa, che possono essere concatenati.

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 
} 

così per esempio

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