iOS 7 CAEmitterLayer порождает частицы неуместно

Странная проблема, которую я не могу решить, где на iOS 7 только, CAEmitterLayer будет порождать частицы на экране неправильно, когда коэффициент рождаемости изначально установлен на ненулевое значение. Это как если бы он вычислял состояние слоя в будущем.

// Create black image particle
CGRect rect = CGRectMake(0, 0, 20, 20);
UIGraphicsBeginImageContext(rect.size);
CGContextFillRect(UIGraphicsGetCurrentContext(), rect);
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

// Create cell
CAEmitterCell *cell = [CAEmitterCell emitterCell];
cell.contents = (__bridge id)img.CGImage;
cell.birthRate = 100.0;
cell.lifetime = 10.0;
cell.velocity = 100.0;

// Create emitter with particles emitting from a line on the
// bottom of the screen
CAEmitterLayer *emitter = [CAEmitterLayer layer];
emitter.emitterShape = kCAEmitterLayerLine;
emitter.emitterSize = CGSizeMake(self.view.bounds.size.width,0);
emitter.emitterPosition = CGPointMake(self.view.bounds.size.width/2,
                                      self.view.bounds.size.height);
emitter.emitterCells = @[cell];

[self.view.layer addSublayer:emitter];

Я видел на DevForums один пост, где несколько человек упоминали, что у них были похожие проблемы с iOS 7 а также CAEmitterLayer, но никто не имел никаких идей, как это исправить. Теперь, когда iOS 7 больше не бета, я решил спросить здесь и посмотреть, сможет ли кто-нибудь взломать его. Я действительно надеюсь, что это не просто ошибка, которую мы должны ждать 7.0.1 или же 7.1 чтобы исправить. Любые идеи будут высоко ценится. Спасибо!

2 ответа

Решение

ДА!

Я потратил часы на эту проблему сам.

Чтобы получить такую ​​же анимацию birthRate у нас было, прежде чем мы используем пару стратегий.

Во-первых, если вы хотите, чтобы слой выглядел так, как будто он начинает излучаться при добавлении в представление, вы должны помнить, что CAEmitterLayer это подкласс CALayer который соответствует CAMediaTiming протокол. Мы должны настроить весь слой эмиттера так, чтобы он начинался в текущий момент:

emitter.beginTime = CACurrentMediaTime();
[self.view.layer addSublayer:emitter];

Это как если бы он вычислял состояние слоя в будущем.

Вы были жутко близки, но на самом деле излучатель начинал в прошлом.

Во-вторых, для анимации между уровнем рождаемости от 0 до n с эффектом, который мы имели до того, как мы можем вместо этого манипулировать свойством жизни

if (shouldBeEmitting){
    emitter.lifetime = 1.0;
}
else{
    emitter.lifetime = 0;
}

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

Для меня проблема с моим CAEmitterLayer при переходе на iOS7 была следующей:

В настройке iOS7 длительность CAEmitterLayerCell привела к тому, что частица вообще не показывается!

Единственное, что мне пришлось изменить, - это удалить cell.duration = XXX, и затем мои частицы снова начали появляться. Я собираюсь съесть яблоко из-за этой неожиданной, необъяснимой суеты.

Другие вопросы по тегам