为什么CALayer的移动速度比UIView慢?

时间:2011-10-13 07:36:58

标签: iphone cocoa-touch uikit core-animation

我有一个UIView子类,当用户触摸它时,使用以下重写方法移动'event':

// In a custom UIView...

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    CGPoint point = [[touches anyObject] locationInView:self];
    UIView *eventView = [self.ringOfEvents hitTest:point withEvent:event];
    for (EventView *e in self.events) {
        if (e == eventView) {
            event.position = point;
        }
    }
}

为什么当我使EventView成为CALayer而不是UIView时,运动会慢慢变成蠕变?我也可以发布该代码,但它非常相似,我认为没有必要。

我认为抽象到较低级别会加速事件处理,但我必须遗漏一些东西。

顺便说一句,如果*eventViewUIViewCALayer的子类,则position属性如下:

- (void)setPosition:(CGPoint)pos {
    self.layer.position = pos;
}

- (CGPoint)position {
    return self.layer.position;
}

不确定为什么当使用UIView作为CALayer时,我的延迟会大大减少..

2 个答案:

答案 0 :(得分:6)

默认情况下,大多数CALayer属性都会随动画一起更改,因此可能会导致延迟减少。

您可能希望在更改图层位置时禁用动画。例如,在herehere

中讨论了可能的解决方案

答案 1 :(得分:2)

这是由隐式动画引起的。

我已经实现了一个类别方法,可以删除givven键的隐式动画,并且可以像这样使用

[view.layer setNullAsActionForKeys:@[@"bounds", @"position"]];

实施

@implementation CALayer (Extensions)

- (void)setNullAsActionForKeys:(NSArray *)keys
{
    NSMutableDictionary *dict = [self.actions mutableCopy];

    if(dict == nil)
    {
        dict = [NSMutableDictionary dictionaryWithCapacity:[keys count]];
    }

    for(NSString *key in keys)
    {
        [dict setObject:[NSNull null] forKey:key];
    }

    self.actions = dict;
}

@end