苹果是否使用黑魔法来完成相机的预览方向?



我有我的这个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是一个全屏幕视图,被限制在屏幕的四个角落。自动旋转正在。

这是问题...

当我设置GLKViewself.ciContext时,它是假设设备在特定方向上创建的。如果设备处于特定的方向,并且我运行了应用程序,则previewView将适合整个self.containerOpenGL区域,但是当我旋转设备时,previewView将在中心。

我看到Apple代码正常工作,并且它们不使用任何约束。他们不使用任何自动旋转方法,没有didLayoutSubviews,当您旋转设备,运行代码时,除了预览视图外,所有内容都旋转。比这更糟糕的是,我的previewView似乎旋转,但没有旋转。

这是黑魔法吗?我该怎么做?

他们将其预览视图添加到uiwindow中,这就是为什么它不旋转的原因。我希望这可以回答这个问题。如果没有,我将继续浏览其源代码。

引用源代码。

我们使视频预览视图查看窗口的子视图,然后将其发送到背面;这使FHViewController的视图(及其UI元素)在视频预览之上,并且还使视频预览不受设备旋转的影响

他们还添加了此

_videoPreviewView.enableSetNeedsDisplay = NO;

这可能会防止其响应

编辑:看来,现在预览旋转了,UI也可以,因此要对其进行打击,您可以添加第二个窗口并将其发送到背面,并使主窗口清晰,并使用一个窗口将PreviewView添加到第二个窗口中dummyviewController告诉它不要通过覆盖适当的方法来自动化。这将允许预览不旋转,但UI旋转。

最新更新