Я пытаюсь настроить CAEmitterLayer
, чтобы создать эффект конфетти, и я столкнулся с двумя проблемами:
- Всякий раз, когда я устанавливаю
birthRate
в своих ячейках на что-то ненулевое, чтобы начать анимацию, я получаю скопление ячеек, помещенных случайным образом на экран, которые оживляют нормально, а затем эмиттер продолжает правильно излучать после этого. - Всякий раз, когда
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"];
}
Опять же, как только он начнется, после начального шквала случайных элементов, это работает просто отлично: все оживляет нормально, и когда потомство BirthRate позже установлено на ноль, оно заканчивается изящно. Кажется, он реагирует на события касания, и я понятия не имею, почему. Я попытался добавить emitterLayer в другое представление, отключив взаимодействие пользователя с этим представлением, а затем добавив его в качестве подсмотра основного представления, и это, похоже, не работает.
Любая помощь/понимание будут оценены очень высоко!
Спасибо, Сэм