如何使CABasicAnimation后的UI对象响应

我在尝试find一种方法来让我的UI对象(UISegmentedControl)在CABasicAnimation幻灯片放入和popup后触摸响应。 我怎么能把这个关掉?

移动后,我知道UI对象在演示树中。 但是我真的很喜欢CABasicAnimation提供的setTimingFunction特性,而我不能使用UIViewanimation获得如此平滑的反弹。

animation的示例GIF(循环):
在这里输入图像说明

我在viewDidLoad中使用的代码

CABasicAnimation *startAnimation = [CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; [startAnimation setFromValue:[NSNumber numberWithFloat:0]]; [startAnimation setToValue:[NSNumber numberWithFloat:slidingUpValue]]; [startAnimation setDuration:1.0]; startAnimation.fillMode = kCAFillModeForwards; startAnimation.removedOnCompletion = NO; [startAnimation setTimingFunction:[CAMediaTimingFunction functionWithControlPoints:0.0 :0.0 :0.3 :1.8]]; [[gameTypeControl layer] addAnimation:startAnimation forKey:nil]; 

什么地方出了错

问题是这两行代码,不理解使用它们的副作用:

 startAnimation.fillMode = kCAFillModeForwards; startAnimation.removedOnCompletion = NO; 

第一行将animationconfiguration为在animation完成后继续显示最终值(您可以在我的小备忘单中看到fillMode和其他与时间相关的属性的可视化效果)。

第二行将animationconfiguration为在完成后保持附加到图层。

这听起来很好,但缺less核心animation的一个重要部分: 添加到图层的animation不会影响模型,只会影响演示文稿 。 核心animation编程指南在“ 核心animation基础 ”部分的第二页中提到:

图层对象的数据和状态信息与屏幕上该图层内容的可视化表示分离。

animation发生在一个单独的图层上,称为performance层,这是您在屏幕上看到的。 如果在animation期间打印出animation属性的值,则根本不会改变。

在animation过程中,演示文稿和模型之间有区别,但是animation可能很短,animation结束后差异就会消失,所以这并不重要,除非animation不会消失。 然后,这种差异一直存在,现在你必须处理两个地方的不同步数据。

如何解决这个问题

人们可以说一切看起来不错,只是命中testing是错误的。 让我们修补打击testing! 更改命中testing以使用段控件的图层表示层,命中testing将起作用。 很好,对吧? 这就好比把一块石膏放在另一块石膏的上面,而不是从根本上解决问题。

如何摆脱副作用

这很简单:不要使用这些线条,并在完成后删除animation。 有人可能会说这个技术(不是删除animation)已经被苹果用在幻灯片和示例代码中,所以这是苹果推荐的,但是有一个很容易被忽略的细节:

当苹果公司在WWDC 2007上推出Core Animation时,他们使用这种技术为被删除的图层设置animation效果(例如淡出)。 以下引用来自第211课 – 向应用程序添加核心animation:

  • 要animation层去除,使用animation
    fillMode = forwards, removedOnCompletion = NO
    • animation委托可以删除图层

在这种情况下,最好不要删除animation,因为它可能会导致图层在从图层分层结构中移除之前,跳回原始大小,不透明度等。 正如他们在上面的幻灯片中所说:“animation代表可以去掉图层”(即:进行清理)。

在其他情况下,没有人会进行清理工作,而且在两个地方(如上所述),你会留下不同步的数据。

解决scheme是一种不同的animation方法

在制作animation的时候,我试着这样想:

如果你的animation神秘地消失了,模型的值应该是预期的最终状态。

应用到你的例子中,分段控制正在朝着它的最终位置前进,并停留在那里。 在这种情况下,分段控制的实际位置应该是最终位置。 即使animation不存在,应用程序也应该可以工作。

那么animation呢? 不是从0偏移量到某个偏移量进行animation处理,而是反转并从一些负偏移量设置为0偏移量。

 CABasicAnimation *startAnimation = [CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; [startAnimation setFromValue:@(-slidingUpValue)]]; // these two changed [startAnimation setToValue:@(0.0)]; // places with each other [startAnimation setDuration:1.0]; // no fill mode // animation is removed on completion [startAnimation setTimingFunction:[CAMediaTimingFunction functionWithControlPoints:0.0 :0.0 :0.3 :1.8]]; [[gameTypeControl layer] addAnimation:startAnimation forKey:@"Move in game type control from bottom"]; // I like adding descriptive keys for easier debugging