Iphone 在iOS上,为什么更改CALayer的帧没有';不会引起动画片吗?
我有一些iOS示例代码,如果我点击主视图,点击处理程序更改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
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