2010-11-13 3 views
3

Итак, я искал все, и я не совсем нашел то, что искал.Запустить действие при касании CALayer?

У меня есть представление, а затем подзаголовок этого вида. На этом втором представлении я создаю CALayers в зависимости от того, какие координаты я ему даю. Я хочу иметь возможность касаться любого из этих CALayers и запускать что-то.

Я нашел различные фрагменты кода, которые выглядят так, как будто они могут помочь, но я не смог их реализовать.

Например:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { if ([touches count] == 1) { for (UITouch *touch in touches) { 

CGPoint point = [touch locationInView:[touch view]]; point = [[touch view] convertPoint:point toView:nil]; 

CALayer *layer = [(CALayer *)self.view.layer.presentationLayer hitTest:point]; 

layer = layer.modelLayer; layer.opacity = 0.5; 

} } } 

, а также это ....

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 

    UITouch *touch = [touches anyObject]; 

    // If the touch was in the placardView, bounce it back to the center 
    if ([touch view] == placardView) { 
     // Disable user interaction so subsequent touches don't interfere with animation 
     self.userInteractionEnabled = NO; 
     [self animatePlacardViewToCenter]; 
     return; 
    }  
} 

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

ответ

13

CALayer не может реагировать на события касания напрямую, но многие другие объекты в вашей программе могут - например, UIView, в котором размещаются слои.

События, такие как событие, которое генерируется системой при касании экрана, отправляются по так называемой «цепочке ответчиков». Поэтому, когда экран тронут, отправляется сообщение (другими словами - метод вызывается) в UIView, который находится в месте касания. Для прикосновений возможны три сообщения: touchesBegan:withEvent:, touchesMoved:withEvent: и touchesEnded:withEvent:.

Если это представление не реализует метод, система попытается отправить его в родительский вид (супервизор на языке iOS). Он пытается отправить его, пока он не достигнет верхнего вида. Если ни один из представлений не реализует метод, он пытается быть доставлен в текущий контроллер представления, затем это родительский контроллер, а затем объект приложения.

Это означает, что вы можете реагировать на события касания, применяя упомянутые методы в любом из этих объектов. Лучшим кандидатом обычно являются хостинг или текущий контроллер.

Предположим, вы реализуете его в представлении. Следующая задача - выяснить, какой из ваших слоев был затронут, для этого вы можете использовать удобный метод convertPoint:toLayer:.

Например, вот это может выглядеть в контроллере представления:

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
    CGPoint p = [(UITouch*)[touches anyObject] locationInView:self.worldView]; 
    for (CALayer *layer in self.worldView.layer.sublayers) { 
     if ([layer containsPoint:[self.worldView.layer convertPoint:p toLayer:layer]]) { 
      // do something 
     } 
    } 
} 
+0

для этой строки: [self.secondView.layer convertPoint: р toLayer: pointLayer] Я получаю сообщение об ошибке, которая говорит: «несовместимый тип для аргумента 1 из 'containsPoint' Любая идея, что я должен делать или что происходит не так? –

+0

Вам нужно убедиться, что вы передаете CGPoint в containsPoint. Используйте промежуточную локальную переменную, если вы не уверены. –