8

我可能错过了一些简单的东西,但试图用图像视图做一个简单的“肯伯恩斯效应”。

首先是代码:

[UIView animateWithDuration:20
                      delay:2
                    options:UIViewAnimationCurveLinear
                 animations:^{
                   CGAffineTransform move = CGAffineTransformMakeTranslation(40, 40);
                   CGAffineTransform zoom    = CGAffineTransformMakeScale(1.2, 1.2);
                   CGAffineTransform transform = CGAffineTransformConcat(zoom, move);
                   self.imageView.transform = transform;
                 }
                 completion:^(BOOL finished){
                   NSLog(@"Done");
                 }];

我希望这将从正常比例的图像视图开始,并在 20 秒内将其扩展到 120% 的大小。实际发生的是它开始时立即小于正常大小,然后扩展为正常大小。

如果我使用比例值的倒数,它开始放大然后缩小到正常比例,这与我想要的效果相反。

有任何想法吗?

4

3 回答 3

11

好的,这实际上有效并且可以满足我的要求。

CABasicAnimation *transformAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
transformAnimation.duration = 20.0;
transformAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
transformAnimation.removedOnCompletion = NO;
transformAnimation.fillMode = kCAFillModeForwards;

CATransform3D xform = CATransform3DIdentity;
xform = CATransform3DScale(xform, 1.2, 1.2, 1.0);
xform = CATransform3DTranslate(xform, 60, -60, 0);
transformAnimation.toValue = [NSValue valueWithCATransform3D:xform];
[self.imageView.layer addAnimation:transformAnimation forKey:@"transformAnimation"];
于 2012-12-06T16:33:06.063 回答
2

听起来视图正在由其父视图重新布局以响应变换的变化,一旦在动画块中设置变换,就将其缩小为变换的最终结果。关键是您的第一次尝试直接对视图进行更改,而第二种方法适用于图层。

于 2012-12-14T22:38:09.617 回答
-2

您是否尝试从 imageView 的当前转换开始?

[UIView animateWithDuration:20
                      delay:2
                    options:UIViewAnimationCurveLinear
                 animations:^{
                   CGAffineTransform trans = self.imageView.transform;
                   CGAffineTransformTranslate(trans, 40, 40);
                   CGAffineTransformScale(trans, 1.2, 1.2);
                   self.imageView.transform = trans;
                 }
                 completion:^(BOOL finished){
                   NSLog(@"Done");
                 }];
于 2012-12-06T00:35:43.163 回答