仿淘宝捏合手势和拖拽手势调整相机镜头焦距

发布于 2021-12-25 21:04:39 字数 2728 浏览 380 评论 0

最新代码请移步github:

https://github.com/shabake/GHGestureDemo

捏合手势和拖拽手势并存,实现调整焦距

**如果运行崩溃请添加`Privacy - Camera Usage Description`**

自定义一个`view`命名为`GHAdjustFocal`,
里面包含五个部分分别是
`backGround`背景 `circle`圆圈 `slider `滑杆 `add `加号 `sub`减号

里面可以通过属性`circleCenterY`设置圆圈的位置
还有两个分别是获取圆圈的当前的`centerY`和滑杆的总高度

### 关键方法

`videoScaleAndCropFactor ` 调整焦距的属性,最小值是1,所以为了安全每个value再加上1

```
AVCaptureConnection * videoConnection = [self.stillImageOutput connectionWithMediaType:AVMediaTypeVideo];

[self.previewLayer setAffineTransform:CGAffineTransformMakeScale(1+value, 1+value)];
videoConnection.videoScaleAndCropFactor = 1 + value;

```

我定义个一个方法讲手势操作之后获取的`value`传进来

```
- (void)adjustFocalWtihValue: (CGFloat)value
```

### 在控制器中调用
#### 初始化
声明一个属性`zoomScale`,因为默认是最大的,所以初始化为1

```self.zoomScale = 1;```

相机的焦距也是最大的为10

```[self.cameraModule adjustFocalWtihValue:10];```

在view上添加捏合手势和拖拽手势

#### 计算
拖拽手势中
```
/// 滑动的距离
CGPoint trans = [panGest translationInView:panGest.view];
/// 获取到圆圈的中心y值
CGFloat circleCenterY = [self.adjustFocal getCircleCenterY]; /// circleY
/// y值自增
circleCenterY += trans.y;
/// 获取到滑动总距离
CGFloat totalHeight = [self.adjustFocal getSliderHeight]; /// 滑动总长度
/// 处理顶部越界
if (circleCenterY <= 20) {
circleCenterY = 20; /// 处理顶部
}
/// 处理底部越界

if (circleCenterY >= self.adjustFocal.gh_height - 40 + 20) {
circleCenterY = self.adjustFocal.gh_height - 40 + 20;
}

/// 刷新圆圈的y值
self.adjustFocal.circleCenterY = circleCenterY;
/// 计算比例
CGFloat scale = (totalHeight - circleCenterY + 20)/totalHeight;
self.zoomScale = scale;
self.test.transform = CGAffineTransformMakeScale(scale, scale);
self.value.text = [NSString stringWithFormat:@"比例%.2f",scale];
/// 重置
[panGest setTranslation:CGPointZero inView:panGest.view];
/// 动态改变相机焦距
[self.cameraModule adjustFocalWtihValue:scale * 10];
```
---

下载地址:http://www.wenjiangs.com/wp-content/uploads/2021/docimg35/3d9570f7930ab79479dc028fa61469ff.zip

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文