无法禁用CALayer的动画>>removeFromSuperlayer

4

我希望能够在不进行动画的情况下从其超级图层中删除CALayer。在此处发生的情况是,图层动画到一个位置,效果很好,但当动画停止时,执行此代码,将图层返回到其起始位置,并淡出;然后可能会从超级图层中删除。如何阻止它进行动画-removeFromSuperlayer?在此处列出的代码对于包括取消注释和未取消注释的所有变体、事务或无事务都具有相同的行为。我错过了什么?

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
    //[self setHidden: YES];

    //[CATransaction flush];
    [CATransaction begin];
    [CATransaction setValue:(id)kCFBooleanTrue
                     forKey:kCATransactionDisableActions];
    //[CATransaction setDisableActions: YES];
    //[CATransaction setAnimationDuration: 0];
    [self removeFromSuperlayer];
    [CATransaction commit];
}

今日免费次数已满, 请开通会员/明日再来
1个回答

5

您可以通过在超级图层上设置操作字典来禁用涉及子层的动画的隐式动画(类似于我在这里的回答):

NSMutableDictionary *newActions = [[NSMutableDictionary alloc] initWithObjectsAndKeys:[NSNull null], @"sublayers", nil];
superlayer.actions = newActions;
[newActions release];

您可能还需要覆盖层(而不是父层)的onOrderOut动作以防止这种情况发生。我在链接的答案中展示了如何实现这一点。

太好了!我之前不知道Actions,谢谢你!现在图层没有返回到初始位置,并且淡出 - 只是短暂地返回到初始位置(像闪烁一样,添加了“sublayers”和“onOrderOut”)。我可以在这里再问一个问题吗?如何让图层在动画后停留在它们结束的位置?再次感谢!(如果可以的话,请点赞) - humasect
1
@humasect - 尝试将动画的fillMode设置为kCAFillModeForwards,并将removedOnCompletion设置为NO。 - Brad Larson
1
哇,删除动画后的一些图层需要做很多工作!但是我会假设默认设置对于更常见的任务更好,并且这个方法完美地解决了问题——谢谢!!+1 - humasect
我无法让它对我起作用。当我触摸按钮时,我将其设置为不同的渐变,但它仍然会淡出。NSMutableDictionary *newActions = [[NSMutableDictionary alloc] initWithObjectsAndKeys:[NSNull null], @"sublayers", nil]; gradientLayerSelected.superlayer.actions = newActions; [newActions release]; - Maciej Swic
@Maciej - 你试过在字典中添加onOrderOut吗?看看NSMutableDictionary *newActions = [[NSMutableDictionary alloc] initWithObjectsAndKeys:[NSNull null], @"onOrderIn", [NSNull null], @"onOrderOut", [NSNull null], @"sublayers", nil];是否更好用。 - Brad Larson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接