我运行了一个简单的AVCaptureSession来获取我的应用程序中的摄像头并拍照。如何使用相机的UIGestureRecognizer实现“收缩缩放”功能?
发布于 2015-07-04 05:37:41
公认的答案实际上是过时的,我不确定它是否真的会拍摄放大图像的照片。答案说,有一种方法可以像There一样放大图像。他回答的问题是,它不负责用户可以放大然后从该缩放位置重新启动的事实。他的解决方案将创建某种不是真正优雅的跳跃。
最简单、最优雅的方法是使用收紧手势的速度。
-(void) handlePinchToZoomRecognizer:(UIPinchGestureRecognizer*)pinchRecognizer {
const CGFloat pinchVelocityDividerFactor = 5.0f;
if (pinchRecognizer.state == UIGestureRecognizerStateChanged) {
NSError *error = nil;
if ([videoDevice lockForConfiguration:&error]) {
CGFloat desiredZoomFactor = device.videoZoomFactor + atan2f(pinchRecognizer.velocity, pinchVelocityDividerFactor);
// Check if desiredZoomFactor fits required range from 1.0 to activeFormat.videoMaxZoomFactor
device.videoZoomFactor = MAX(1.0, MIN(desiredZoomFactor, device.activeFormat.videoMaxZoomFactor));
[videoDevice unlockForConfiguration];
} else {
NSLog(@"error: %@", error);
}
}
}我发现,将arctan函数添加到速度中会使放大和缩小效果变得稍微轻松一些。它不是完全完美的,但效果足以满足需要。当它几乎达到1时,可能会有另一个函数来简化缩小。
NOTE:另外,一个收缩手势的比例从0到无限大,0到1是放大(缩小),1到无限大是缩小(放大)。要获得良好的放大和缩小效果,你需要有一个数学方程。速度实际上是从-infinite到无穷大,0是起始点。
编辑:修复了范围异常时的崩溃。感谢@garafajon!
发布于 2012-04-19 11:04:26
许多人试图通过将层上的transform属性设置为CGAffineTransformMakeScale(gesture.scale.x, gesture.scale.y);来做到这一点,请参阅here以获得完整的收缩到缩放的实现。
发布于 2015-04-08 05:39:02
从iOS 7开始,您可以使用AVCaptureDevice的videoZoomFactor属性直接设置缩放。
使用缩放常数将UIPinchGestureRecognizer的scale属性绑定到videoZoomFactor。这可以让你改变对口味的敏感度:
-(void) handlePinchToZoomRecognizer:(UIPinchGestureRecognizer*)pinchRecognizer {
const CGFloat pinchZoomScaleFactor = 2.0;
if (pinchRecognizer.state == UIGestureRecognizerStateChanged) {
NSError *error = nil;
if ([videoDevice lockForConfiguration:&error]) {
videoDevice.videoZoomFactor = 1.0 + pinchRecognizer.scale * pinchZoomScaleFactor;
[videoDevice unlockForConfiguration];
} else {
NSLog(@"error: %@", error);
}
}
}请注意,AVCaptureDevice和其他所有与AVCaptureSession相关的东西都不是线程安全的。因此,您可能不希望在主队列中执行此操作。
https://stackoverflow.com/questions/10220958
复制相似问题