在显示图层之前应用CGAffineTransform

Dan*_*Dan 0 core-animation objective-c ios

我正在尝试缩放,AVCaptureVideoPreviewLayer以便它显示相机的“放大”预览;我可以使用来完成这项工作setAffineTransform:CGAffineTransformMakeScale(2.0f, 2.0f),但是只有在屏幕上可见该图层时才可以。也就是说,除非我CATransaction在回调之类的过程中(从内调用),否则缩放转换似乎不会生效。viewDidAppear

我真正想做的是在图层变得可见之前应用比例转换,例如在我初始化并将其添加到UIView图层时,但是我所做的所有尝试都被证明是徒劳的。如果我在这一点上设置了转换,然后尝试在可见时重新读回该值,则它似乎具有所需的比例转换集-但这对视图没有任何影响。我是iOS编程的新手,所以我确定这里缺少一些基本知识;任何帮助表示赞赏!

Wil*_*ker 5

两种简单的替代方法,一种(更好)用于iOS 7.x,一种用于早期版本的iOS:

float zoomLevel = 2.0f;
if ([device respondsToSelector:@selector(setVideoZoomFactor:)]
    && device.activeFormat.videoMaxZoomFactor >= zoomLevel) {
  // iOS 7.x with compatible hardware
  if ([device lockForConfiguration:nil]) {
    [device setVideoZoomFactor:zoomLevel];
    [device unlockForConfiguration];
  }
} else {
  // Lesser cases
  CGRect frame = captureVideoPreviewLayer.frame;
  float width = frame.size.width * zoomLevel;
  float height = frame.size.height * zoomLevel;
  float x = (frame.size.width - width)/2;
  float y = (frame.size.height - height)/2;
  captureVideoPreviewLayer.bounds = CGRectMake(x, y, width, height);
}
Run Code Online (Sandbox Code Playgroud)