【问题标题】:Strange behavior from affine transform rotation on iOSiOS上仿射变换旋转的奇怪行为
【发布时间】:2012-12-04 02:25:01
【问题描述】:

我想做一个相当简单的 UIImageView 旋转。基本上我有一个完美方形图像中的轮子图像,我想在动画下旋转它。

所以我尝试了这个:

- (void)testButtonPressed:(id)sender {
    NSLog(@"Test button pressed");
    CGAffineTransform transform = CGAffineTransformMakeRotation(1.0);

    [UIView animateWithDuration:10.0 delay:0 options:UIViewAnimationOptionCurveLinear
                     animations:^{
                         dial.transform = transform;  // "dial" is a UIImageView
                     }
                     completion: ^(BOOL finished){
                     }];
 }

发生的情况是,当动画开始时,图像(大约 300 平方)立即向上跳跃 50-100 像素并被“挤压”成一个狭窄的椭圆形。之后,动画就正常进行了。

我尝试改用 beginAnimation 并得到相同的行为。

我知道我不明白关于旋转起源的东西(文档在圈子里说话),但挤压似乎很奇怪,而且这一切同时发生(与动画相比)的事实很奇怪。

有什么想法吗?

(这是在 Xcode 4.5.1 的 iPhone 6.0 模拟器上运行的。可能只是一个模拟器吗?)

更新:我有机会再做一些工作(我在“真正的”工作之间做这件事)。我创建了一个从未有过自动布局的新 XIB,并且轮子是“正常的”,但背景是垂直压缩的。

然后有点灵感。我注意到图像视图在 NLog 转储中被标记为“自动调整大小”。没有看到从 IB 关闭它的方法,但确实看到您可以在主视图上关闭“自动调整子视图”。这样做了,它的表现很完美!

我认为为自动布局引入的一些新功能是这里的罪魁祸首。不过,我不知道我是否找到了所有神奇的设置。

但是......我的图像的“透明”部分在 iPad 上仍然是黑色的,即使在所有内容上关闭“不透明”后也是如此。

更新:我终于发现我的图像是 JPG 24 位模式而不是 32 位模式。这适用于模拟器 - 纯黑色被解释为透明。但它不适用于 iPad。使用 32 位图像解决了这个问题,并且(关闭“自动调整子视图以消除奇怪的扭曲/翻译”)一切都很好除了 ...旋转> 180 度向后动画。动画正在“智能”并采用“最短路径”。

我想我只需要将动画分成两个步骤。

【问题讨论】:

  • 我尝试在方形 UIImage 视图上编写代码,对我来说效果很好。
  • 嗯。我使图像更小(留出更多边距)并且它不会扭曲,但在开始时它会向下和向右跳。
  • 让它更小,图像跳下一堆。但更奇怪的是,它背后的图像(没有动画)被水平挤压。这是我能想到的最普通的设置。
  • 如果我把背景图像变小它不会变形,但现在轮子又向右跳了。
  • 好吧,它变得陌生了。发生在我关闭自动布局时,然后跳跃停止,但在 iPhone 模拟器上,图像开始垂直挤压并向上移位。但是,在 iPad 模拟器(使用 iPad xib)上,它可以完美运行。但是在真正的 iPad 上(手边没有合适版本的 iPhone)它可以工作,但是图像的透明部分是黑色的(而不是透明的)。

标签: ios uiimageview cgaffinetransform


【解决方案1】:

你为什么不用 CABasicAnimation 来做呢。

CABasicAnimation* rotationAnimation;
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
rotationAnimation.toValue = [NSNumber numberWithFloat: -M_PI_2 ];
rotationAnimation.duration = 2.0;
rotationAnimation.cumulative = YES;
rotationAnimation.repeatCount = 1.0; 
rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];

[imageView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    相关资源
    最近更新 更多