Запустить действие при касании CALayer? - PullRequest
3 голосов
/ 13 ноября 2010

Так что я искал повсюду и не совсем нашел то, что искал.

У меня есть представление, а затем подпредставление этого представления. На этом втором виде я создаю 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;
    }       
}

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

1 Ответ

13 голосов
/ 13 ноября 2010

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

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

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

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

Допустим, вы реализуете это в представлении. Следующая задача - выяснить, какие слои были затронуты, для этого вы можете использовать удобный метод 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
        }
    }
}
...