问题描述
我想将多个转换应用于 UIView
(或 UIView
的子类),例如translate,旋转和缩放。我知道,两个变换可以与,但如果我有三个或更多变换,我该怎么办?
我见过这些问题:
-
感谢
参见
- (docs)
- (docs)
此答案已通过Swift 4测试
I would like to apply multiple transforms to a
UIView
(or subclass ofUIView
), such as translate, rotate, and scale. I know that two transforms can be applied withCGAffineTransformConcat
, but how do I do it if I have three or more transforms?I have seen these questions:
but these questions are asking something different, and the given answers just talk about applying two transforms with
CGAffineTransformConcat
. Also, they use Objective-C rather than Swift.解决方案You can apply multiple transforms by stacking them on top of each other.
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
Or more compactly (but not necessarily as readable):
imageView.transform = CGAffineTransform.identity.translatedBy(x: 100, y: 300).rotated(by: CGFloat.pi / 4).scaledBy(x: -1, y: 2)
This series of transforms produces the image on the right:
Thanks to this answer for teaching me how to do it.
Notes
The order in which you apply the transforms matters. For example, if the transforms were done in the opposite order it would produce the following result.
t = t.scaledBy(x: -1, y: 2) t = t.rotated(by: CGFloat.pi / 4) t = t.translatedBy(x: 100, y: 300)
See also
- CGAffineTransform Reference (docs)
- Transforms (docs)
- Swift: Translating and Rotating a CGContext, A Visual Explanation (iOS/Xcode)
- Demystifying CGAffineTransform
This answer has been tested with Swift 4
这篇关于如何在Swift中应用多个转换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!