我正在使用以下功能将脉冲效果应用于视图
- (void)pulse {
CATransform3D trasform = CATransform3DScale(self.layer.transform, 1.15, 1.15, 1);
trasform = CATransform3DRotate(trasform, angle, 0, 0, 0);
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];
animation.toValue = [NSValue valueWithCATransform3D:trasform];
animation.autoreverses = YES;
animation.duration = 0.3;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
animation.repeatCount = 2;
[self.layer addAnimation:animation forKey:@"pulseAnimation"];
}
我想使用CGAffineTransform self.transform而不是CATransform3D self.layer.transform获得相同的结果。这可能吗?
答案 0 :(得分:7)
可以将CATransform3D
转换为CGAffineTransform
,但您将失去一些功能。我发现将图层及其祖先的聚合转换转换为CGAffineTransform
非常有用,因此我可以使用Core Graphics渲染它。约束是:
.m34
的透视/透视将被中和如果这听起来不错:
// m13, m23, m33, m43 are not important since the destination is a flat XY plane.
// m31, m32 are not important since they would multiply with z = 0.
// m34 is zeroed here, so that neutralizes foreshortening. We can't avoid that.
// m44 is implicitly 1 as CGAffineTransform's m33.
CATransform3D fullTransform = <your 3D transform>
CGAffineTransform affine = CGAffineTransformMake(fullTransform.m11, fullTransform.m12, fullTransform.m21, fullTransform.m22, fullTransform.m41, fullTransform.m42);
您需要首先完成3D变换的所有工作,比如通过连接超级层,最后将汇总CATransform3D
转换为CGAffineTransform
。鉴于层开始时是平的并且渲染到平坦目标上,我发现这非常合适,因为我的3D旋转变成了2D剪切。我还发现牺牲透视可以接受。没有办法解决这个问题,因为仿射变换必须保留平行线。
例如,要使用Core Graphics渲染3D变换图层,您可以连接变换(尊重锚点!),然后转换为仿射,最后:
CGContextSaveGState(context);
CGContextConcatCTM(context, affine);
[layer renderInContext:context];
CGContextRestoreGState(context);
答案 1 :(得分:2)
当然。如果您在Xcode文档中搜索CGAffineTransform,您将找到一个标题为“CGAffineTransform Reference”的章节。在该章中有一个名为“函数”的部分。它包含的功能相当于CATransform3DScale(CGAffineTransformScale)和CATransform3DRotate(CGAffineTransformRotate)。
请注意,您对CATransform3DRotate的调用并没有多大意义。您需要绕轴旋转,并且所有3个轴都传递0。通常,您希望使用CATransform3DRotate(trasform,angle,0,0, 1.0 )围绕Z轴旋转。引用文档:
如果向量的长度为零,则行为未定义。
答案 2 :(得分:0)
您可以使用 CATransform3DGetAffineTransform 将 CATransform3d 转换为 CGAffineTransform。
let scaleTransform = CATransform3DMakeScale( 0.8, 0.8, 1)
imageview.transform = CATransform3DGetAffineTransform(scaleTransform)