iphone - 无法设置动画持续时间

标签 iphone ios objective-c

大家好!

好吧,我有一个非常简单的麻烦。 我有一个带有两个子层的 CATransformLayer,每个子层都有“false”doubleSided 属性,这形成了一张双面卡片。 问题是,我无法设置动画持续时间或任何其他选项,例如 UIViewAnimationCurveEaseInOut 等。 我尝试了一种新的和旧的方法来为我的层添加动画选项和持续时间,但不幸的是,它旋转了大约 0.25 秒,如默认值所述。怎么了?任何建议,将不胜感激。

代码如下:

1) 所有东西的初始化:

    #ifndef SUPPORTED_MACRO
    #define DEGREES_TO_RADIANS(angle) (angle * M_PI / 180.0)
    #endif
    - (void)viewDidLoad
    {
          [super viewDidLoad];

          [super viewDidLoad];

          CATransformLayer *cardContainer = [CATransformLayer layer];
          cardContainer.anchorPoint = CGPointMake( 0.5 , 1.0 ) ;
          cardContainer.position = CGPointMake(100.0, 200.0) ;
          cardContainer.bounds = CGRectMake(0.0, 0.0, 150.0, 170.0);

          CALayer *cardFront  = [CALayer layer]; // the front part of card
          cardFront.bounds = CGRectMake(0.0, 0.0, cardContainer.bounds.size.width,     cardContainer.bounds.size.height) ;
          cardFront.frame = cardContainer.bounds ;
          cardFront.contentsGravity  = kCAGravityResizeAspect ;
          cardFront.borderColor = [UIColor blackColor].CGColor;
          cardFront.borderWidth = 2.0;
          cardFront.cornerRadius = 30.0;
          [cardContainer addSublayer:cardFront];

          CALayer *cardBack  = [CALayer layer]; //back part of card
          cardBack.bounds = CGRectMake(0.0, 0.0, cardContainer.bounds.size.width, cardContainer.bounds.size.height) ;
          cardBack.frame     = cardContainer.bounds;
          cardBack.contentsGravity  = kCAGravityResizeAspect ;
          cardBack.borderColor = [UIColor blackColor].CGColor;
          cardBack.borderWidth = 2.0;
          cardBack.cornerRadius = 30.0;
          cardBack.doubleSided = NO;

 cardBack.transform = CATransform3DMakeRotation(DEGREES_TO_RADIANS(180.0),0.0,1.0,0.0);
[cardContainer addSublayer:cardBack];

((CALayer*)[cardContainer.sublayers objectAtIndex:0]).contents = (id)[UIImage imageNamed:@"1.png"].CGImage ;
((CALayer*)[cardContainer.sublayers objectAtIndex:1]).contents = (id)[UIImage imageNamed:@"2.png"].CGImage ;

          TL = cardContainer ;
          [self.view.layer addSublayer:cardContainer];

 }

2) 旋转过程(以不推荐的方式):

    -(void)Rotate
    {
          static double CallCounter = 1.0 ;

          auto CATransform3D t3d = CATransform3DIdentity;
          t3d.m34 = 1.0/-500.0;

          [UIView  beginAnimations:nil context:NULL];
          [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
          [UIView setAnimationDuration:1.75];
          TL.sublayerTransform = CATransform3DRotate(t3d, -(CallCounter*M_PI) , 1.0, 0.0, 0.0) ;
          [UIView commitAnimations];

          CallCounter += 1.0 ;

}

最佳答案

嗯,问题很简单。问题是,并非对象的每个属性都可以设置动画。例如,我们不能为这个表达式设置动画:

   int *a = ( int* ) malloc ( 5 * sizeof ( int ) ) ;

或者这个:

   int x = 5 ;

或者,最后,这个:

    TL.sublayerTransform = CATransform3DRotate(t3d, -(CallCounter*M_PI) , 1.0, 0.0, 0.0) ;

因为 transform 属性的想法是生成一个矩阵,该矩阵将被写入 sublayerTransfrom 类字段。而且,基本上对于编译器来说,它是与 malloc 调用或初始化 x 变量相同的表达式——它是一个赋值操作。看起来,CATransformLayer 类有某种检查器,只有当属性改变它的值时才会调用它。 Cocoa 会在属性更改时自动发送消息。通过键值观察机制。

因此,要为这个不可动画的属性设置动画,我决定使用 CATransaction block 。他们在这种情况下真的很有帮助。希望有人会发现这篇文章有用!对不起我的英语,我来自俄罗斯)

关于iphone - 无法设置动画持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18269173/

相关文章:

php - 如何将我自己的日历与我的手机(iPhone、Android 等)同步

iphone - 帮助破译 iPhone 应用程序代码

ios - 嵌套的 UITableview 行高在 iOS 8 中没有得到完美更新

objective-c - Facebook 图表 API : audio share

c++ - 是否有静态分析器可以检查 C/C++/Objective-C 中的局部变量重新分配?

objective-c - 带有 NSString 数组的 RLMObject

iphone - 应用程序不会在 iOS6 上开始使用 testflight

c# - ServiceStack 真的适合 iOS/Objective-C 客户端吗?

ios - 核心数据 setPrimitive-setter 导致 EXC_BAD_ACCESS

objective-c - UIImage 基于图 block 的 map 移动缓慢