Ios 如果未附加到任何层次结构,如何在没有renderInContext的情况下将UIView绘制到CGContext

Ios 如果未附加到任何层次结构,如何在没有renderInContext的情况下将UIView绘制到CGContext,ios,objective-c,uiview,Ios,Objective C,Uiview,我正在把东西画到一个视频帧上,我发现最好的方法是从视频帧中获取CVImageBufferRef,然后像其他CGContext绘图一样画进/画上它 现在我有了大量的UIView,我只是简单地创建了它们,而没有将它们添加到任何superview中。我希望在没有RenderContext的情况下绘制这些UIView,因为这将使我每帧需要1秒的时间,或者每秒视频需要30秒的渲染时间 如果使用drawViewHierarchyInRect则不会绘制任何内容 如果使用drawRect则不会绘制任何内容,并且

我正在把东西画到一个视频帧上,我发现最好的方法是从视频帧中获取
CVImageBufferRef
,然后像其他CGContext绘图一样画进/画上它

现在我有了大量的UIView,我只是简单地创建了它们,而没有将它们添加到任何superview中。我希望在没有RenderContext的情况下绘制这些UIView,因为这将使我每帧需要1秒的时间,或者每秒视频需要30秒的渲染时间

如果使用
drawViewHierarchyInRect
则不会绘制任何内容

如果使用
drawRect
则不会绘制任何内容,并且会出现大量无效的上下文错误

我正在调用之前的
setNeedsDisplay
setNeedsLayout
,并且RECT都有效

非自定义UIView(如UILabel)也存在同样的问题

CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

   // Lock the image buffer
    CVPixelBufferLockBaseAddress(imageBuffer,0);



    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(CVPixelBufferGetBaseAddress(imageBuffer),
                                                     CVPixelBufferGetWidth(imageBuffer),
                                                     CVPixelBufferGetHeight(imageBuffer),
                                                     8,
                                                     CVPixelBufferGetBytesPerRow(imageBuffer),
                                                     colorSpace,
                                                     kCGBitmapByteOrder32Little |
                                                     kCGImageAlphaPremultipliedFirst);


    // now i want to draw my UIView


    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);



    // Unlock the image buffer
    CVPixelBufferUnlockBaseAddress(imageBuffer,0);

如果未将UIView添加到任何SuperView,则无处可绘制。从根本上说,绘图只在设备屏幕上进行(除了专门针对特定创建的上下文(如pdf或图像上下文或您创建的位图上下文)进行渲染)

通常绘制到UIView时,它是层次结构的一部分,最终是将所有图形映射到设备屏幕的单个图形上下文的一部分


可以在使用CG调用创建的位图上下文中绘制。如果您试图绘制文本,可能需要使用CoreText。

我有大约20个非常复杂的UI视图,需要绘制到视频帧上。那么我该怎么做呢?我能想到的唯一“诀窍”就是创建一个UIView,并将其置于主视图层次结构中其他所有内容的后面。将复杂视图附加到该视图,并将其层渲染到位图上下文中。