Я действительно застрял с некоторыми недостатками CALayer.CALayer ведет себя по-разному при создании заново при применении CATransform3dIdentity
У меня есть слой, который знает, как нарисовать стрелу.
Я применяю какое-то преобразование на каждом кадре на нем.
Но он работает только так, как ожидается, если я всегда создаю этот слой с нуля и применим преобразование. И это не работает, если я пытаюсь повторно использовать один и тот же старый слой (применяя свойство CATransform3dIdentity). Через «он не работает» я имею в виду, что он мерцает на экране, и преобразование не применяется по мере необходимости по сравнению с преобразованием, применяемым к вновь созданному слою.
Мой код выглядит следующим образом:
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
transformModel = [OverlayTransformExtractor transformFromPixelBuffer:sampleBuffer];
if(transformModel)
{
//I tried also not removing it every time but just transforming.. the effect is the same
[firstLayer removeFromSuperlayer];
if(!firstLayer)
{
firstLayer = [VNArrowLayer layer];
firstLayer.frame = CGRectMake(videoView.frame.origin.x, videoView.frame.origin.y, videoView.frame.size.width, videoView.frame.size.height);
originalTransform = firstLayer.transform;
}
//resetting the previous transforms
firstLayer.transform = CATransform3DIdentity;
[self applyTransform:transformModel.transform];
dispatch_async(dispatch_get_main_queue(), ^(void)
{
[arrowView.layer addSublayer:firstLayer];
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue
forKey:kCATransactionDisableActions];
[firstLayer setNeedsDisplay];
[CATransaction commit];
});
}
else
{
dispatch_async(dispatch_get_main_queue(),^
{
[firstLayer removeFromSuperlayer];
[secondLayer removeFromSuperlayer];
});
}
}
Некоторые предложения о почему он ведет себя по-другому, когда он только что создали? Я проверил преобразование таким же. Я даже попытался установить то же положение, что и новый слой (0,0), но он еще более странный (он остается в левом верхнем углу)
Я также подумал, что, возможно, это из-за неявной анимации, поэтому я попытался отключить его -> никаких изменений.
Добавление нового слоя каждый раз неприемлемо. Память заполняется довольно быстро, хотя я вручную пытаюсь установить первый слой на нуль.