【发布时间】:2010-11-09 19:45:21
【问题描述】:
对 UIView 及其对应的 CALayer 应用多个转换是否有任何问题?
具体来说,您能否“混合搭配”CATransform3D 和 CGAffineTransforms 而不会遇到问题?
在同时动画另一个变换变化的同时直接设置一些变换是否有任何问题?
是否有任何“规则”来说明如何做到这一点,或者有任何设计模式?
【问题讨论】:
标签: iphone cocoa-touch uikit core-animation
对 UIView 及其对应的 CALayer 应用多个转换是否有任何问题?
具体来说,您能否“混合搭配”CATransform3D 和 CGAffineTransforms 而不会遇到问题?
在同时动画另一个变换变化的同时直接设置一些变换是否有任何问题?
是否有任何“规则”来说明如何做到这一点,或者有任何设计模式?
【问题讨论】:
标签: iphone cocoa-touch uikit core-animation
我意识到这并不能完全回答这个问题(或接近),但如果您只使用 CGAffineTransforms,您可以使用 CGAffineTransformConcat() 来组合多个转换。
只要您正确连接转换,当某些转换为动画而其他转换不为动画时,这将正常工作。当您还进行图层转换时,我不知道这是如何工作的。
【讨论】:
CGAffineTransformConcat 适用于两个转换,但对于三个或更多转换来说有点尴尬。看到this answer做两个以上。
pix0r 是对的,但这里有更多关于此的信息。 The official docs for 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);
【讨论】:
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)
【讨论】:
我成功地同时平移和旋转了一个imageView,这样:
float scaleFactor_x = 2.8;
float scaleFactor_y = 2.45;
imgBigBallBasic.frame = CGRectMake(112, 20, 100, 100);
CGAffineTransform scaleTrans = CGAffineTransformMakeScale(scaleFactor_x, scaleFactor_y);
CGAffineTransform translateTrans = CGAffineTransformMakeTranslation(0, 55);
imgBigBallBasic.contentMode = UIViewContentModeScaleAspectFit;
imgBigBallBasic.transform = CGAffineTransformConcat(translateTrans, scaleTrans);
imgBigBallBasic.frame = CGRectMake(112, 20, 100, 100);
imgBigBallBasic.center = [[imgBigBallBasic window] center];
[UIView commitAnimations];
【讨论】: