iOS写在定制相机之前

Posted 善斋书屋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS写在定制相机之前相关的知识,希望对你有一定的参考价值。

  • 问题

    不是所有的拍照UIImagePickerController都能搞定,理由如下:

    1.产品不整点幺蛾子,哪来体验创新

    2.设计不整点幺蛾子,怎能体现用心

    3.运营:这体验跟某宝某信咋不一样???

    4.开发:我是被逼成大佬的!!!1.2.3.层层施压,大厂能搞得,你咋搞不了

  • 思路:

    定制相机,绕不开的问题:UIImagePickerController中那块实时场景怎么搞?

    方案上一般是采用AVCaptureSession + AVCaptureVideoPreviewLayer

    AVCaptureVideoPreviewLayer继承CALayer, 设置bounds、frame, 可满足简单需求

    But, 横竖屏切换、iPhone与iPad共用、视图效果调整【毕竟上面的1.2.话语权普遍大过开发】等此类情况下,frame的方式哪有约束来的实在

    每个view都有一个layer属性,定制view的layer为AVCaptureVideoPreviewLayer, view约束调整改变frame即可

  • 上菜

    • 定义一个view

      @interface AVPreView : UIView
      
      @end
    • 设置layerClass

      + (Class)layerClass {
          return [AVCaptureVideoPreviewLayer class];
      }
    • 为了实时场景,layer即AVCaptureVideoPreviewLayer 是需要设置一个session的

      // 设置属性
      @property (nonatomic, strong) AVCaptureSession *session;
      
      // Getter & Setter
      - (AVCaptureSession *)session {
          return [(AVCaptureVideoPreviewLayer *)self.layer session];
      }
      
      - (void)setSession:(AVCaptureSession *)session {
          [(AVCaptureVideoPreviewLayer *)self.layer setSession:session];
      }
      
    • 需要设置聚焦之类的,此时需要对view上触碰的点转换成摄像头的位置

      -(CGPoint)captureDevicePointForPoint:(CGPoint)point{
          AVCaptureVideoPreviewLayer *layer = (AVCaptureVideoPreviewLayer *)self.layer;
          //将屏幕上点击的位置转化成摄像头的位置
          return [layer captureDevicePointOfInterestForPoint:point];
      }
  • Game Over. Code不行,多敲敲。

以上是关于iOS写在定制相机之前的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发——定制圆形头像与照相机图库的使用

片段中的 Android 相机预览

Sublime Text自定制代码片段(Code Snippets)

如何从Android片段中的相机获取图像

在片段之间切换时如何处理相机?

如何在片段中从相机捕获图像,