2011-04-08 48 views
3

我有一个CALayer子类,它受限于父层的宽度,但是具有固定的高度。我想隐式动画禁用调整窗口的大小,但每当我设置图层的高度时启用。选择性覆盖CALayer隐式动画

要禁用动画时,窗口大小我设置图层的行动

NSMutableDictionary *actions = [[NSMutableDictionary alloc] initWithObjectsAndKeys:[NSNull null], @"bounds", [NSNull null], @"position", nil]; 

,这似乎工作。然后,我已经覆盖了actionForKey:方法我的层子

- (id<CAAction>)actionForKey:(NSString *)event 
{ 
    if ([event isEqualToString:@"frame.size.height"]) { 
     CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"frame.size.height"]; 
     [animation setDuration:0.5f]; 
     return animation; 
    } 
    return nil; 
} 

但后来当我改变我的层的高度与

[layer setValue:[NSNumber numberForFloat:50.0] forKey:@"frame.size.height"]; 

高度的变化,但没有设置动画。我看到了使用frame.size.height调用的actionForKey:方法,但不管我返回的是否都是动画。如果我没有设置动作,或者有actionForKey:方法,那么高度动画正确,但是窗口大小调整也是动画的,我不想要。另外,也许我误解了,但我认为从actionForKey返回nil:会使默认动画运行,但它似乎即使存在的方法停止所有隐式动画(无论操作字典设置与否)。

我在这里错过了什么,我会很感激任何指针。

回答

3

你的子类将得到actionForKey:为每个键调用它,所以如果你返回nil,那么将不会有该键的动作。如果您需要默认动画,则应返回[super actionForKey:event][CALayer defaultActionForKey:event]。 。

图层的frame从其boundsposition计算,所以如果没有动画,这两个,还有不能成为frame动画*

你想要做的是:

[CATransaction setValue:kCFBooleanTrue 
       forKey:kCATransactionDisableActions] 

当您的图层因调整窗口大小而调整大小时。这将仅在此时禁用动画(对于此事务);当你直接改变图层的大小时,它仍然会动画。我不确定这个电话的正确位置是什么;我只是试图通过窗口正在调整大小的通知进行回调,但没有奏效。我相信,要弄清楚将代码放在哪里并不难。


*:其实,文档说:

注:框架属性不是直接动画。相反,您应该为边界,anchorPoint和位置属性的适当组合设置动画效果,以获得所需的结果。

+0

谢谢,扫清事情了。我结束了CAConstraintsLayoutManager的子类化并禁用了layoutSublayersOfLayer:方法中的操作。它似乎工作,但我不知道这是否是最好的方式来做到这一点。 – iain 2011-04-08 17:28:23

+0

关于正确的声音。我让我的观点本身采用'CALayoutManager'协议来做一个相关的,稍微简单的案例。很高兴我能帮上忙。 – 2011-04-08 17:37:25

+1

它看起来也适用于禁用父图层的layoutSublayers方法中的操作。 – iain 2011-04-08 17:41:44

1

有,他们说..几种方法对皮肤这只猫 ...我觉得最简单的是一个......通过在层的“操作”字典设置一些条目..

CALayer *stopAnimatingLikeThat = CALayer.new; 
stopAnimatingLikeThat.actions = 
    @{ @"position":NSNull.null, @"bounds":NSNull.null }; 

这将停止恼人的“卡在蜜”“隐式动画”上界的变化等等

+0

这是一个很好的方法来做到这一点,因为你可以设置你的CALayer在初始化时不调整位置和边界。 – 2013-07-10 08:15:32

+0

在没有隐式动画的情况下重绘图层中的文本'yourLayer.actions = @ {@“contents”:NSNull.null};' – 2013-08-30 02:08:55