color ios swift uiview transform cgaffinetransform

ios - navigationitem title color



Cómo aplicar múltiples transformaciones en Swift (2)

En Swift 3, estas han sido reemplazadas por funciones en CGAffineTransform, que se pueden encadenar.

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 }

así por ejemplo

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

Me gustaría aplicar múltiples transformaciones a una UIView (o subclase de UIView ), como traducir, rotar y escalar. Sé que dos transformaciones se pueden aplicar con CGAffineTransformConcat , pero ¿cómo lo hago si tengo tres o más transformaciones?

He visto estas preguntas:

pero estas preguntas plantean algo diferente, y las respuestas dadas solo hablan sobre la aplicación de dos transformaciones con CGAffineTransformConcat . Además, usan Objective-C en lugar de Swift.


Puedes aplicar múltiples transformaciones apilándolas una encima de la otra.

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 más compacta (pero no necesariamente como legible):

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

Esta serie de transformaciones produce la imagen de la derecha:

Gracias a esta respuesta por enseñarme cómo hacerlo.

Notas

  • El orden en el que se aplican las transformaciones importa. Por ejemplo, si las transformaciones se hicieran en el orden opuesto, se produciría el siguiente resultado.

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

Ver también

Esta respuesta ha sido probada con Swift 4.