我有一个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:会使默认动画运行,但它似乎即使存在的方法停止所有隐式动画(无论操作字典设置与否)。
我在这里错过了什么,我会很感激任何指针。
谢谢,扫清事情了。我结束了CAConstraintsLayoutManager的子类化并禁用了layoutSublayersOfLayer:方法中的操作。它似乎工作,但我不知道这是否是最好的方式来做到这一点。 – iain 2011-04-08 17:28:23
关于正确的声音。我让我的观点本身采用'CALayoutManager'协议来做一个相关的,稍微简单的案例。很高兴我能帮上忙。 – 2011-04-08 17:37:25
它看起来也适用于禁用父图层的layoutSublayers方法中的操作。 – iain 2011-04-08 17:41:44