CAEmitterLayer испускает случайные нежелательные частицы при касании

Я пытаюсь настроить CAEmitterLayerдля создания эффекта конфетти и столкнулся с двумя проблемами:

  1. Всякий раз, когда я устанавливаю birthRateв своих ячейках на что-то отличное от -ноль, чтобы запустить анимацию, я получаю поток ячеек, случайно размещенных на экране, которые анимируются нормально, а затем эмиттер продолжает правильно излучать после этого.
  2. Всякий раз, когда emitterCellsрисуют что-то на экране, каждый раз, когда я касаюсь экрана, излучатель рисует emitterCellsв (кажущихся )случайными местах, которые существуют в течение (кажущегося )случайным промежутка времени. Ничто в эмиттере не привязано к каким-либо событиям касания (, т. е. я намеренно ничего не рисую по событию касания ), но слой находится в представлении, имеющем несколько встроенных представлений. Чем больше я прикасаюсь, тем больше клеток появляется.

Вот мой код для настройки эмиттера, а затем его запуска и остановки (после того, как я вызвал функцию остановки:затем нажатия на экран перестают создавать новые случайные элементы):

- (void)setupConfetti
{
    self.confettiLayer = [CAEmitterLayer layer];
    [self.view.layer addSublayer:self.confettiLayer];
    [self.view.layer setNeedsDisplay];

    self.confettiLayer.emitterPosition = CGPointMake(1024.0/2,-50.0);
    self.confettiLayer.emitterSize = CGSizeMake(1000.0, 10.0);
    self.confettiLayer.emitterShape = kCAEmitterLayerLine; 
    self.confettiLayer.renderMode =kCAEmitterLayerUnordered;

    CAEmitterCell *confetti = [CAEmitterCell emitterCell];

    confetti1.contents =  (id)[[UIImage imageNamed:@"confetti.png"] CGImage];

    confetti.emissionLongitude = M_PI;
    confetti.emissionLatitude = 0;
    confetti.lifetime = 5;
    confetti.birthRate = 0.0;
    confetti.velocity = 125;
    confetti.velocityRange = 50;
    confetti.yAcceleration = 50;
    confetti.spin = 0.0;
    confetti.spinRange = 10;
    confetti.name = @"confetti1";

    self.confettiLayer.emitterCells = [NSArray arrayWithObjects:confetti, nil];
}

Чтобы начать конфетти:

- (void)startConfettiAnimation
{
    [self.confettiLayer setValue:[NSNumber numberWithInt:10.0] forKeyPath:@"emitterCells.confetti.birthRate"];
}

И остановить это:

- (void)stopConfettiAnimation
{
    [self.confettiLayer setValue:[NSNumber numberWithInt:0.0] forKeyPath:@"emitterCells.confetti.birthRate"];
}

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

Любая помощь/понимание будет высоко оценена!

Спасибо, Сэм

38
задан null 25 June 2013 в 16:02
поделиться