Ios CALayer在创建新实体和应用CATTransferM3DidEntity时的行为不同
我真的被一些卡莱尔知识的缺失所困扰 我有一个图层知道如何画箭头 我在它的每一帧上应用一些变换 但是,只有当我总是从头开始创建这个层并应用转换时,它才能像预期的那样工作。如果我尝试重用同一个旧层(通过应用CATTransferm3DidEntity),它将不起作用。通过“它不工作”,我的意思是它在屏幕上闪烁,与应用于新创建的层的变换相比,变换没有按需要应用 我的代码如下所示:Ios CALayer在创建新实体和应用CATTransferM3DidEntity时的行为不同,ios,calayer,caanimation,Ios,Calayer,Caanimation,我真的被一些卡莱尔知识的缺失所困扰 我有一个图层知道如何画箭头 我在它的每一帧上应用一些变换 但是,只有当我总是从头开始创建这个层并应用转换时,它才能像预期的那样工作。如果我尝试重用同一个旧层(通过应用CATTransferm3DidEntity),它将不起作用。通过“它不工作”,我的意思是它在屏幕上闪烁,与应用于新创建的层的变换相比,变换没有按需要应用 我的代码如下所示: - (void)captureOutput:(AVCaptureOutput *)captureOutput didOut
- (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),但是它更奇怪(它仍然在左上角)
我还认为可能是因为隐式动画的缘故,所以我试着把它关掉->没有改变
不接受每次添加一个新层。内存很快就满了,即使我手动尝试将firstLayer设置为nil。如上所述,当我对现有层(每帧)应用变换时,它会闪烁。当在每一帧创建它时,它都是完美的,但内存密集 我不知道是什么使它闪烁,也许是一些约束或布局的东西,我找不到任何信息,但 我设法使方法(每一帧都有一个新层)起作用。我的想法是,我删除了旧的层,并将nil分配给它,而不是在主线程上,这会导致释放发生得晚,并以这种方式快速填充我的内存 因此,解决方案是删除旧层,创建新层,并在主线程上应用转换 如果smb能够提供一个解释闪烁的答案,我很乐意将其标记为正确答案