2013-05-04 2 views
1

У меня есть UIView, в котором 2 CALayers добавляют [self.layer addSublayer:subLayerA]; //... дают следующую иерархию вида:Почему моя Трассировка в UIView не идентифицирующий CALayer прикоснулся

UIView subclass 
- backing layer (provided by UIView) 
    - subLayerA 
    - subLayerB 

Если я переопределить touchesBegan в контроллере представления что представляет UIView его правильно идентифицирует CALayer прикоснулся:

// in view controller 

#import <QuartzCore/QuartzCore.h> 
//..... 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
     UITouch *touch = [touches anyObject]; 
     CGPoint touchPoint = [touch locationInView:self.view]; 
     CALayer *touchedLayer = [self.view.layer.presentationLayer hitTest:touchPoint]; // returns a copy of touchedLayer 
     CALayer *actualLayer = [touchedLayer modelLayer]; // returns the actual CALayer touched 
     NSLog (@"touchPoint: %@", NSStringFromCGPoint(touchPoint)); 
     NSLog (@"touchedLayer: %@", touchedLayer); 
     NSLog (@"actualLayer: %@", actualLayer); 
} 

Однако, если переопределить touchesBegan в UIView которой защитный слой является родителем двух подслоев, он будет возвращать null для CALayer (хотя дает правильный TouchPoint):

// in UIView subclass 

#import <QuartzCore/QuartzCore.h> 
//..... 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    CGPoint touchPoint = [touch locationInView:self]; 
    CALayer *touchedLayer = [self.layer.presentationLayer hitTest:touchPoint]; // returns a copy of touchedLayer 
    CALayer *actualLayer = [touchedLayer modelLayer]; // returns the actual CALayer touched 
    NSLog (@"touchPoint: %@", NSStringFromCGPoint(touchPoint)); 
    NSLog (@"touchedLayer: %@", touchedLayer); 
    NSLog (@"actualLayer: %@", actualLayer); 
} 

Любые идеи где я ошибаюсь?

ответ

0

Я до сих пор не знаю, почему мой исходный код в подклассе UIView не работал. В качестве обходного пути я смог индивидуально протестировать hitView на каждом интересующем слое.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    CGPoint touchPoint = [touch locationInView:self]; 

    //check if subLayerA touched 
    if ([subLayerA hitTest:touchPoint]) { 
     // if not nil, then subLayerA hit 
     NSLog(@"subLayerA hit"); 
    } 
    //check if subLayerB touched 
    if ([self.subLayerB hitTest:touchPoint]) { 
     // if not nil, then subLayerB hit 
     NSLog(@"subLayerB hit"); 
} 

Я не буду отмечать это как правильно все же, как я технически не ответил, почему мой исходный код не работал - и кто-то еще может иметь ответ.

1

У меня была такая же проблема ..

метод Трассировка CALayer требует места в координатах супер слоя приемника.

Так, добавив следующую строку следует исправить: TouchPoint = [self.layer convertPoint: TouchPoint toLayer: self.layer.superlayer]

Это объясняет, почему тест [subLayerA Трассировка: TouchPoint] работает (TouchPoint находится в координатном пространстве для «self», который является родительским элементом subLayerA)

Надеюсь, что это поможет.

См: https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html#//apple_ref/occ/instm/CALayer/hitTest:

+0

Это такая ежу понятно и имеет полный смысл. A +. Я бы купил тебе пиво, если бы мог. –

Смежные вопросы