将多个变换应用于UIView/CALayer

Cor*_*oyd 30 iphone cocoa-touch core-animation uikit

将多个变换应用于UIView并且它是相应的CALayer是否有任何问题?

具体来说,您是否可以"混合和匹配"CATransform3D与CGAffineTransforms而不会遇到问题?

在动画另一个变换同时动画时,是否还有直接设置变换的问题?

是否有任何"规则"应该如何做,或任何设计模式?

pix*_*x0r 45

我意识到这并不能完全回答(或接近),但如果你只使用CGAffineTransforms,你可以CGAffineTransformConcat()用来组合多个变换.

只要你正确地连接转换,当一些变换被动画而其他变换没有动画时,这将正常工作.当你也进行层变换时,我不知道它是如何工作的.

  • `CGAffineTransformConcat`适用于两个转换,但对于三个或更多转换有点不利.请参阅[此答案](http://stackoverflow.com/questions/30929986/how-to-apply-multiple-transforms-in-swift/30929987#30929987)执行两项以上的操作. (2认同)

whi*_*awk 36

pix0r是对的,但这里有更多信息.CGAffineTransformConcat()的官方文档.

另外,这是一个简单的例子:

// Rotate 45 degrees
CGAffineTransform rotate = CGAffineTransformMakeRotation(45*(M_PI/180));
// Move to the left
CGAffineTransform translate = CGAffineTransformMakeTranslation(-50,0);
// Apply them to a view
self.view.transform = CGAffineTransformConcat(translate, rotate);
Run Code Online (Sandbox Code Playgroud)

  • 不应该是CGAffineTransformConcat(旋转,翻译),因为这些点是行向量? (2认同)

Jus*_*ely 7

使用Swift 3和4语法略有改变.@ whitehawk的答案适应:

// Rotate 45 degrees
var rotate = CGAffineTransform(rotationAngle: 45 * (.pi / 180))
// Move to the left
var translate = CGAffineTransform(translationX: -50, y: 0)
// Apply them to a view
self.view.transform = translate.concatenating(rotate)
Run Code Online (Sandbox Code Playgroud)