Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios CALayer在创建新实体和应用CATTransferM3DidEntity时的行为不同_Ios_Calayer_Caanimation - Fatal编程技术网

Ios CALayer在创建新实体和应用CATTransferM3DidEntity时的行为不同

Ios CALayer在创建新实体和应用CATTransferM3DidEntity时的行为不同,ios,calayer,caanimation,Ios,Calayer,Caanimation,我真的被一些卡莱尔知识的缺失所困扰 我有一个图层知道如何画箭头 我在它的每一帧上应用一些变换 但是,只有当我总是从头开始创建这个层并应用转换时,它才能像预期的那样工作。如果我尝试重用同一个旧层(通过应用CATTransferm3DidEntity),它将不起作用。通过“它不工作”,我的意思是它在屏幕上闪烁,与应用于新创建的层的变换相比,变换没有按需要应用 我的代码如下所示: - (void)captureOutput:(AVCaptureOutput *)captureOutput didOut

我真的被一些卡莱尔知识的缺失所困扰

我有一个图层知道如何画箭头

我在它的每一帧上应用一些变换

但是,只有当我总是从头开始创建这个层并应用转换时,它才能像预期的那样工作。如果我尝试重用同一个旧层(通过应用CATTransferm3DidEntity),它将不起作用。通过“它不工作”,我的意思是它在屏幕上闪烁,与应用于新创建的层的变换相比,变换没有按需要应用

我的代码如下所示:

- (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能够提供一个解释闪烁的答案,我很乐意将其标记为正确答案