Iphone 在iOS上,为什么更改CALayer的帧没有';不会引起动画片吗?

Iphone 在iOS上,为什么更改CALayer的帧没有';不会引起动画片吗?,iphone,ios,core-animation,Iphone,Ios,Core Animation,我有一些iOS示例代码,如果我点击主视图,点击处理程序更改CALayer对象的frame属性,层对象将根据其位置和大小设置动画 但是如果我把动画放在ViewController的viewDidLoad中: UIImage *shipImage = [UIImage imageNamed:@"SpaceShip1.png"]; ship1 = [[CALayer alloc] init]; ship1.contents = (id) [shipImage CGImage]; ship1.fram

我有一些iOS示例代码,如果我点击主视图,点击处理程序更改
CALayer
对象的
frame
属性,层对象将根据其位置和大小设置动画

但是如果我把动画放在
ViewController
viewDidLoad
中:

UIImage *shipImage = [UIImage imageNamed:@"SpaceShip1.png"];
ship1 = [[CALayer alloc] init];

ship1.contents = (id) [shipImage CGImage];
ship1.frame = CGRectMake(50, 50, 100, 100);

[self.view.layer addSublayer:ship1];

ship1.frame = CGRectMake(0, 0, 300, 200);

那么动画就不会发生了。它将只使用
(0,0,300,200)
,而不使用动画。这是为什么?如何使其工作?

您没有指定时间延迟或动画时间。因此,对象将在显示之前移动,而您将无法在前面的位置看到它。您还需要返回到运行循环,以便显示任何动画。

您没有指定时间延迟或动画时间。因此,对象将在显示之前移动,而您将无法在前面的位置看到它。您还需要返回到运行循环,以便显示任何动画。

有几件事

首先,“帧”属性不可设置动画。相反,应该设置边界(更改大小)和位置(移动层)的动画

引用文件:

注意:“帧”属性不能直接设置动画。相反,你 应设置边界、锚点和点的适当组合的动画 并定位属性以实现所需的结果

其次,在更改可设置动画的特性之前,必须在添加层后返回事件循环

当您返回并且系统访问事件循环时,下次更改可设置动画的属性时,系统将创建动画事务以设置该更改的动画

由于您创建了一个层,设置了它的帧,然后对其进行了更改,所有这些都是在返回之前完成的,因此您的代码只需在最后一帧添加该层

您应该做的是设置层,将其安装到其父层,然后返回。可以使用PerformSelect:withObject:afterDelay:在添加层后调用动画:

- (void)viewDidLoad
{
  UIImage *shipImage = [UIImage imageNamed:@"SpaceShip1.png"];
  ship1 = [[CALayer alloc] init];

  ship1.contents = (id) [shipImage CGImage];
  ship1.frame = CGRectMake(50, 50, 100, 100);

  [self.view.layer addSublayer:ship1];

  [self performSelector: @selector(changeLayer)
    withObject: nil 
    afterDelay: 0.0];
}


- (void) changeLayer
{
  //Animate changes to bounds and position, not frame.
  ship1.bounds = CGRectMake(0, 0, 300, 200);
  //Note that position is based on the center of the layer by default, so you'll 
  //need to adjust your desired position.
  ship1.position = CGPointMake(0,0);
}
有几件事

首先,“帧”属性不可设置动画。相反,应该设置边界(更改大小)和位置(移动层)的动画

引用文件:

注意:“帧”属性不能直接设置动画。相反,你 应设置边界、锚点和点的适当组合的动画 并定位属性以实现所需的结果

其次,在更改可设置动画的特性之前,必须在添加层后返回事件循环

当您返回并且系统访问事件循环时,下次更改可设置动画的属性时,系统将创建动画事务以设置该更改的动画

由于您创建了一个层,设置了它的帧,然后对其进行了更改,所有这些都是在返回之前完成的,因此您的代码只需在最后一帧添加该层

您应该做的是设置层,将其安装到其父层,然后返回。可以使用PerformSelect:withObject:afterDelay:在添加层后调用动画:

- (void)viewDidLoad
{
  UIImage *shipImage = [UIImage imageNamed:@"SpaceShip1.png"];
  ship1 = [[CALayer alloc] init];

  ship1.contents = (id) [shipImage CGImage];
  ship1.frame = CGRectMake(50, 50, 100, 100);

  [self.view.layer addSublayer:ship1];

  [self performSelector: @selector(changeLayer)
    withObject: nil 
    afterDelay: 0.0];
}


- (void) changeLayer
{
  //Animate changes to bounds and position, not frame.
  ship1.bounds = CGRectMake(0, 0, 300, 200);
  //Note that position is based on the center of the layer by default, so you'll 
  //need to adjust your desired position.
  ship1.position = CGPointMake(0,0);
}

有3种方法可以在iOS上触发动画:

1。UIView动画

您可以使用
UIView.animateWithDuration
方法或其他变体直接指定需要动画。您可以指定诸如持续时间、延迟、完成块等参数

2。核心动画-隐式动画(所需方法)

顾名思义,此动画是在没有显式命令的情况下触发的。但为了工作,您需要设置
CALayer
委托,如下所示:

ship1.delegate = self;
除非您另有说明,否则所有参数都具有默认值。要修改这些参数,需要调用
CATransaction

[CATransition setAnimationDuration:0.2];
重要:这些
CATransaction
调用必须放在修改图层属性之前,因为所有动画都是异步进行的(在不同的运行时线程中),如果将这些调用放在后面,那就太晚了

3。核心动画-显式动画

创建一个
CAAnimation
(有不同的
CAAnimation
子类可供选择)并将其附加到图层:

CABasicAnimation *a = [CABasicAnimation alloc] init....

[ship1 addAnimation:a];

我希望这澄清了一些关于这个主题的疑问。

在iOS上触发动画有三种方法:

1。UIView动画

您可以使用
UIView.animateWithDuration
方法或其他变体直接指定需要动画。您可以指定诸如持续时间、延迟、完成块等参数

2。核心动画-隐式动画(所需方法)

顾名思义,此动画是在没有显式命令的情况下触发的。但为了工作,您需要设置
CALayer
委托,如下所示:

ship1.delegate = self;
除非您另有说明,否则所有参数都具有默认值。要修改这些参数,需要调用
CATransaction

[CATransition setAnimationDuration:0.2];
重要:这些
CATransaction
调用必须放在修改图层属性之前,因为所有动画都是异步进行的(在不同的运行时线程中),如果将这些调用放在后面,那就太晚了

3。核心动画-显式动画

创建一个
CAAnimation
(有不同的
CAAnimation
子类可供选择)并将其附加到图层:

CABasicAnimation *a = [CABasicAnimation alloc] init....

[ship1 addAnimation:a];

我希望这澄清了一些关于这个主题的疑问。

首先,我没有在您的代码中看到uiview动画块。第二,你应该在ViewWillDisplay或ViewDidDisplay uiview委托方法中设置动画。不需要动画代码。。。如果在点击处理程序中,我将帧设置为
CGRectMake(200,200,30,30)
,那么它将自己制作所有动画,在不指定动画的情况下如何制作动画?如果你是说fra