Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 为什么可以';我不能在CABASICanization完成后设置图层的不透明度吗?_Iphone_Ios_Ipad_Core Animation_Calayer - Fatal编程技术网

Iphone 为什么可以';我不能在CABASICanization完成后设置图层的不透明度吗?

Iphone 为什么可以';我不能在CABASICanization完成后设置图层的不透明度吗?,iphone,ios,ipad,core-animation,calayer,Iphone,Ios,Ipad,Core Animation,Calayer,我有一个名为specialLayer的子层视图。不透明度的隐式动画被禁用,如下所示: self.specialLayer.actions = [NSDictionary dictionaryWithObjectsAndKeys: [NSNull null], @"opacity", nil]; 只有两种方法可以访问此子层 - (void)touchDown { self.specialLayer.o

我有一个名为
specialLayer
的子层视图。不透明度的隐式动画被禁用,如下所示:

self.specialLayer.actions = [NSDictionary dictionaryWithObjectsAndKeys:
                                            [NSNull null], @"opacity", nil];
只有两种方法可以访问此子层

- (void)touchDown {
    self.specialLayer.opacity = 0.25f;
}

- (void)touchUp {
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
    animation.fromValue = [NSNumber numberWithFloat:self.specialLayer.opacity];
    animation.toValue = [NSNumber numberWithFloat:1.0];
    animation.duration = 0.5;
    animation.removedOnCompletion = NO;
    animation.fillMode = kCAFillModeForwards;
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
    [self.specialLayer addAnimation:animation forKey:@"opacity"];
}
发生这种情况:

1) 用户按下按钮(按住)并调用-触地。特殊图层的不透明度立即变为0.25

2) 用户释放按钮,然后调用-touchUp。specialLayer的不透明度将设置回1.0的动画

这个序列只工作一次

3) 用户再次按下按钮(按住)并调用-触地。但specialLayer的不透明度在屏幕上不会改变!即使
self.specialLayer.opacity=0.25f,也不会发生任何事情被调用。不透明度似乎保持在1.0f

4) 用户举起手指,然后-进行润色。specialLayer的不透明度跳到0.25,并从那里设置动画到1.0f

我使用NSLog进行了检查,以确保按此顺序调用这些方法。是的

当我取消注释动画代码并将不透明度直接设置为1.0时,后续的直接不透明度更改将立即生效。显然是卡巴斯基化导致了问题。删除禁用隐式动画的代码对此问题没有影响

我一辈子都搞不清楚这里发生了什么。为什么CALayer不反映我在一段时间后为不透明度添加了CABASICANIATION后设置的不透明度值?这是虫子吗


我做错了什么?

您将动画的
removedOnCompletion
设置为
NO
。这意味着当动画完成时,它仍然停留在层上,并且仍然控制
不透明度的值,以便进行渲染。第二次调用此代码时,新动画将替换旧动画,从而导致跳转(因为它现在使用新设置的
0.25f
作为起点)

解决方法是停止将
removedOnCompletion
设置为
NO
。相反,您应该在添加动画的同时,将层的实际不透明度设置为与动画端点相同的值

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
// you can omit fromValue since you're setting it to the layer's opacity
// by omitting fromValue, it uses the current value instead. Just remember
// to not change layer.opacity until after you add the animation to the layer
animation.toValue = [NSNumber numberWithFloat:1];
animation.duration = 0.5;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
[layer addAnimation:animation forKey:@"opacity"];
layer.opacity = 1; // or layer.opacity = [animation.toValue floatValue];

这是因为层渲染的工作方式。当CoreAnimation将层树渲染到屏幕上时,它复制模型树并生成所谓的表示树。它通过复制所有层,然后应用所有动画来实现这一点。因此,它遍历层上的每个动画,将时间插入计时函数,将结果进度插入“从/到”值之间的插值,并将最终值应用回表示层的属性

因此,当您将动画永久保留在层上时,该动画将始终覆盖关键点的实际模型值。无论您更改了多少次
图层。不透明度
,控制
不透明度
的动画始终会覆盖该值,以便于演示


这也是为什么添加动画后可以将
层.opacity
设置为所需的任何值,因为动画将优先。只有当动画被删除时(默认情况下,当动画完成时),该属性的模型值才会再次使用。

层不透明度被破坏是什么意思?在添加动画之前,需要设置层不透明度的最终值。Like layer.opacity=1.0用更多细节更新了问题。@Produmember:你看过我的答案了吗?第一句话解释了你的基本问题。如果您有任何问题,请告诉我。有一个类似的问题(与动画和不透明度有关),我尝试在此处回答:。我对答案很好奇。对不起,我不知道如何通过评论与您联系。。。