【问题标题】:Custom animatable property returns NSNull?自定义动画属性返回 NSNull?
【发布时间】:2014-09-20 20:58:27
【问题描述】:

赏金仅剩一天!

您能否使用 UIView animateWithDuration 块语法使用自定义动画属性?

我一直致力于为自定义 CALayer 上的自定义动画属性创建自己的隐式动画。

我已经设置了自定义UIView 的支持层,并且可以使用CATransaction 为自定义属性设置动画(在自定义示例中,我正在使用自定义属性circleColor 更改圆的颜色)。

我知道UIView 通过从actionForLayer:forKey: selector 上的actionForLayer:forKey: selector 方法返回NSNull 来关闭动画属性。然后,当属性被包裹在 UIView animateWithDuration 块中时UIView 将返回动画

所以这将适用于backgroundColor、不透明度等。但是,我的自定义属性circleColor 仍然返回NSNull

我希望我为这个问题提供了足够的背景信息。谢谢!

【问题讨论】:

  • 您使用自定义图层类吗?你会覆盖+ (BOOL)needsDisplayForKey:(NSString *)key 还是- (id<CAAction>)actionForKey:(NSString *)key

标签: ios objective-c uiview uikit core-animation


【解决方案1】:

所以这个问题已经存在很长时间了,我的结论是这是不可能的。下面的代码显示了我将如何打开要在块中检测的自定义属性。此方法在 UIView 中被覆盖。

- (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event {
    NSLog(@"%s - event: %@", __PRETTY_FUNCTION__, event);
    id<CAAction> action = [super actionForLayer:layer forKey:event];
    if ([event isEqualToString:@"circleColor"] && (nil == action || (id)[NSNull null] == action)) {
        return [CABasicAnimation animationWithKeyPath:event];
    }
    return action;
}

该代码允许您在 UIView 块内制作动画,但是无法检测到它是否在 UIView 块内。因此,如果您使用此代码,那么它甚至会在 UIView 块之外进行动画处理,从而违背了目的。我会监视其他人的反应,但似乎唯一的选择是制作您自己的自定义 UIView 动画块系统,这将允许您添加自定义动画属性。我想 Facebook 的 Pop 框架将是一个很好的替代解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2015-08-13
    • 2012-12-20
    • 1970-01-01
    • 2012-07-29
    • 2018-11-12
    相关资源
    最近更新 更多