仿淘宝捏合手势和拖拽手势调整相机镜头焦距
最新代码请移步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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论