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:

Ale te pytania zadają coś różne, a podane odpowiedzi mówią tylko o zastosowaniu dwóch przekształceń z CGAffineTransformConcat. Ponadto używają Objective-C zamiast Swift.
Author: Community, 2015-06-19

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:

Tutaj wpisz opis obrazka

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)
    

Tutaj wpisz opis obrazka

Zobacz też

ta odpowiedź została przetestowana za pomocą Swift 4

 91
Author: Suragch,
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)
 19
Author: Tyler Sheaffer,
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