Ios 在显示图层之前应用CGAffineTransform

Ios 在显示图层之前应用CGAffineTransform,ios,objective-c,core-animation,Ios,Objective C,Core Animation,我正在尝试缩放一个AVCaptureVideoPreviewLayer,这样它就可以从相机上显示一个“放大”的预览;我可以使用setAffineTransform:cAffineTransformMakeScale(2.0f,2.0f)来实现这一点,但只有当图层在屏幕上可见时。也就是说,除非我在像viewdide这样的回调过程中调用它(从CATransaction),否则缩放变换似乎不会生效 我真正想做的是在图层变得可见之前应用缩放变换——例如,在我初始化它并将其添加到UIView——但我所有的

我正在尝试缩放一个
AVCaptureVideoPreviewLayer
,这样它就可以从相机上显示一个“放大”的预览;我可以使用
setAffineTransform:cAffineTransformMakeScale(2.0f,2.0f)
来实现这一点,但只有当图层在屏幕上可见时。也就是说,除非我在像
viewdide
这样的回调过程中调用它(从
CATransaction
),否则缩放变换似乎不会生效


我真正想做的是在图层变得可见之前应用缩放变换——例如,在我初始化它并将其添加到
UIView
——但我所有的尝试都被证明是徒劳的。如果我在这一点上设置变换,然后在该值可见后尝试读回该值,它看起来确实设置了所需的缩放变换,但对视图没有任何影响。我对iOS编程还不熟悉,所以我确信这里缺少一些基本的东西;感谢您的帮助

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

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

第一种方法使用相机设备的本机缩放功能,因此不需要调整captureVideoPreviewLayer的大小(iOS 7+);第二种方法通过按缩放比例调整captureVideoPreviewLayer的边界(而不是其帧)来处理较旧的系统。第一种方法使用相机设备的本机缩放功能,因此不需要调整captureVideoPreviewLayer的大小(iOS 7+);第二种方法通过按缩放比例调整captureVideoPreviewLayer的边界(而不是其帧)来处理较旧的系统。