我使用以下函数将脉冲效应应用于视图
- (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"];
}I希望使用CGAffineTransform self.transform而不是CATransform3D self.layer.transform获得相同的结果。可以吗?
发布于 2013-08-26 15:32:08
可以将CATransform3D转换为CGAffineTransform,但您将失去一些功能。我发现将一个层及其祖先的聚合转换转换为一个CGAffineTransform非常有用,这样我就可以用Core来呈现它。制约因素是:
你的输入在XY平面上会被视为平面,在too
.m34的平面上,输出将被视为平面,而来自.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);发布于 2012-05-08 17:24:52
当然了。如果在Xcode文档中搜索CGAffineTransform,就会发现一个名为"CGAffineTransform引用“的章节。在这一章中有一节叫做“函数”。它包括相当于CATransform3DScale (CGAffineTransformScale )和CATransform3DRotate (CGAffineTransformRotate)的函数。
请注意,您对CATransform3DRotate的调用没有实际意义。你需要绕着一个轴旋转,所有三个轴都是0。通常,您希望使用CATransform3DRotate(trasform,角,0,0,1.0)绕Z轴旋转。引用文档:
如果向量的长度为零,则行为未定义.
发布于 2021-03-23 11:32:34
您可以使用CATransform3DGetAffineTransform将CATransform3d转换为CGAffineTransform。
let scaleTransform = CATransform3DMakeScale( 0.8, 0.8, 1)
imageview.transform = CATransform3DGetAffineTransform(scaleTransform)https://stackoverflow.com/questions/10497397
复制相似问题