我有我的这个Avoundation摄像头应用程序。相机预览是通过DidoutputSamplebuffer方法应用的过滤器的结果。
设置相机时,我正在关注Apple在其示例代码之一(Cifunhouse)上所做的工作:
// setting up the camera
CGRect bounds = [self.containerOpenGL bounds];
_eaglContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];
_videoPreviewView = [[GLKView alloc] initWithFrame:bounds
context:_eaglContext];
[self.containerOpenGL addSubview:_videoPreviewView];
[self.containerOpenGL sendSubviewToBack:_videoPreviewView];
id<MTLDevice> device = MTLCreateSystemDefaultDevice();
NSDictionary *options = @{kCIContextUseSoftwareRenderer : @(NO),
kCIContextPriorityRequestLow : @(YES),
kCIContextWorkingColorSpace : [NSNull null]};
_ciContext = [CIContext contextWithEAGLContext:_eaglContext options:options];
[_videoPreviewView bindDrawable];
_videoPreviewViewBounds = CGRectZero;
_videoPreviewViewBounds.size.width = _videoPreviewView.drawableWidth;
_videoPreviewViewBounds.size.height = _videoPreviewView.drawableHeight;
dispatch_async(dispatch_get_main_queue(), ^(void) {
CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI);
_videoPreviewView.transform = transform;
_videoPreviewView.frame = bounds;
});
self.containerOpenGL
是一个全屏幕视图,被限制在屏幕的四个角落。自动旋转正在。
这是问题...
当我设置GLKView
和self.ciContext
时,它是假设设备在特定方向上创建的。如果设备处于特定的方向,并且我运行了应用程序,则previewView
将适合整个self.containerOpenGL
区域,但是当我旋转设备时,previewView
将在中心。
我看到Apple代码正常工作,并且它们不使用任何约束。他们不使用任何自动旋转方法,没有didLayoutSubviews
,当您旋转设备,运行代码时,除了预览视图外,所有内容都旋转。比这更糟糕的是,我的previewView
似乎旋转,但没有旋转。
这是黑魔法吗?我该怎么做?
他们将其预览视图添加到uiwindow中,这就是为什么它不旋转的原因。我希望这可以回答这个问题。如果没有,我将继续浏览其源代码。
引用源代码。
我们使视频预览视图查看窗口的子视图,然后将其发送到背面;这使
FHViewController
的视图(及其UI元素)在视频预览之上,并且还使视频预览不受设备旋转的影响
他们还添加了此
_videoPreviewView.enableSetNeedsDisplay = NO;
这可能会防止其响应
编辑:看来,现在预览旋转了,UI也可以,因此要对其进行打击,您可以添加第二个窗口并将其发送到背面,并使主窗口清晰,并使用一个窗口将PreviewView添加到第二个窗口中dummyviewController告诉它不要通过覆盖适当的方法来自动化。这将允许预览不旋转,但UI旋转。