Jak zastosować wiele przekształceń w Swift
Chciałbym zastosować wiele przekształceń do UIView
(lub podklasy UIView
), takich jak translate, rotate i scale. Wiem, że dwie transformacje można zastosować z CGAffineTransformConcat
, ale jak to zrobić, jeśli mam trzy lub więcej przekształceń?
Widziałem te pytania:
- stosowanie wielu przekształceń do interfejsu UIView / CALayer
- Używanie Wielu CGAffineTransforms Na Macierzy Tekstowej
CGAffineTransformConcat
. Ponadto używają Objective-C zamiast Swift. 2 answers
Można zastosować wiele przekształceń, układając je jeden na drugim.
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
Lub bardziej zwięzły (ale niekoniecznie jako czytelny):
imageView.transform = CGAffineTransform.identity.translatedBy(x: 100, y: 300).rotated(by: CGFloat.pi / 4).scaledBy(x: -1, y: 2)
Ta seria przekształceń tworzy obraz po prawej stronie:
Dzięki tej odpowiedzi za nauczenie mnie, jak to zrobić.
Uwagi
-
Kolejność stosowania przekształceń ma znaczenie. Przykładowo, jeśli transformacje były wykonywane w odwrotnej kolejności to dałoby to następujący wynik.
t = t.scaledBy(x: -1, y: 2) t = t.rotated(by: CGFloat.pi / 4) t = t.translatedBy(x: 100, y: 300)
Zobacz też
- Cgaffinetransform Reference (docs)
- przekształca (docs)
- Dzięki temu, że jest on w pełni kompatybilny z CGContext, można go używać w dowolnym miejscu na świecie.]}
- Demystify CGAffineTransform
ta odpowiedź została przetestowana za pomocą Swift 4
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-06 03:28:53
W Swifcie 3 zostały one zastąpione przez funkcje na samym CGAffineTransform, które można przykleić łańcuchem.
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
}
Więc na przykład
let transform = CGAffineTransform(scaleX: 1.0, y: 3.0).translatedBy(x: 12, y: 9).rotated(by: 17.0)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-17 06:36:44