在显示图层之前应用CGAffineTransform

时间:2014-04-01 23:55:25

标签: ios objective-c core-animation

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

我真正想要做的是将比例变换之前应用到层变得可见 - 例如。在我初始化它并将其添加到UIView时 - 但我所有这样做的尝试都被证明是徒劳的。如果我在此时设置了变换,然后尝试在值可见后再读取它,它似乎确实具有所需的缩放变换集 - 但它对视图没有任何影响。我是iOS编程的新手,所以我确定我在这里找不到基本的东西;任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:4)

两种简单的替代方法,一种(更好)适用于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);
}