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:
- Aplicando múltiples transformaciones a un UIView / CALayer
- Uso de múltiples CGAffineTransforms en matriz de texto
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
- Referencia de CGAffineTransform (docs)
- Transforms (docs)
- Swift: traduciendo y rotando un CGContext, una explicación visual (iOS / Xcode)
- Desmitificando CGAffineTransform
Esta respuesta ha sido probada con Swift 4.