2011-10-13 74 views
2

我有一個UIView子類,當用戶觸摸它們,使用下面的重寫的方法搬來搬去「事件的:爲什麼CALayer的移動速度比UIView的慢?

// 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 ..

回答

5

默認情況下,大多數CALayer屬性都隨動畫更改,所以延遲降低可能是由此引起的。

您可能希望在更改圖層位置時禁用動畫。例如在herehere

+1

阿中使用,這是definetely它;在圖層'位置'的'actions'字典中添加一個'[NSNull null]'使得圖層的移動延遲迴到了'UIView'的水平,然後一些..謝謝! –

1

中討論了可能的解決方案,這是由於隱含的動畫。

我已經實現了一個類中的方法從而消除隱性動畫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 
+0

'frame'不是一個動畫屬性,不需要包含在密鑰字典中。 – titaniumdecoy

+0

@titaniumdecoy我已更新 – hfossli

相關問題