zoukankan      html  css  js  c++  java
  • 截取UIImagePickerController的拍照事件

    前言 :

        iOS拍照可以用AVCaptureSession和UIImagePickerController来实现,两者都可以自定义拍照界面,UIImagePickerController有iOS原生的拍照界面,用起来很简单,但是有时候回需要在拍照界面加点文字说明,边框之类的修饰views,在用户点击拍照按钮后,隐藏这些修饰views。

     在调起UIImagePickerController 来拍照的时候,如下图,添加了拍摄边框和文字说明


    解决方案:

    在模态推出UIImagePickerController的时候,viewController遵循UINavigationControllerDelegate, 会走这个代理方法

    - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{

    //里面能获取到视图的层级关系

    viewController就是 CAMImagePickerCameraViewController

    }

    此时查看图层关系

    拍照按钮在CAMBottomBar上

    重拍按钮在PLCropOverlayPreviewBottomBar,而PLCropOverlayPreviewBottomBar又在PLCropOverlayBottomBar

    思路 : 找到拍照按钮和重拍按钮,给两个按钮添加事件。

    代码:

    - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{

        for (UIView *tmpView in viewController.view.subviews) {

            NSLog(@"tmpView.subviews_%@", tmpView.subviews);

            NSArray *tmpViewSubviews = tmpView.subviews;

            [tmpViewSubviews enumerateObjectsUsingBlock:^(UIView   * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

                if ([[[obj class]description]isEqualToString:@"CAMBottomBar"]) {

                    for (UIView *tmpView3 in obj.subviews) {

                        NSLog(@"CAMBottomBar.subviews_%@", obj.subviews);

                        if ( [[[tmpView3 class]description]isEqualToString:@"CUShutterButton"]) {

                            //拍照按钮

                            UIButton *shutButton = (UIButton *)tmpView3;

                            @weakify(self);

                            [[shutButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {

                                @strongify(self);

                                self.horizontalScreenPromptsView.hidden = YES;

                                self.promptslabel.text = @"";

                            }];

                            break;

                        }

                    }

                }

                if ([[[obj class]description]isEqualToString:@"PLCropOverlayBottomBar"]) {

                    for (UIView *tmpView3 in obj.subviews) {

                        NSLog(@"PLCropOverlayBottomBar%@", obj.subviews);

                        if ( [[[tmpView3 class]description]isEqualToString:@"PLCropOverlayPreviewBottomBar"]) {

                            for (UIView *tmpView4 in tmpView3.subviews) {

                                NSLog(@"PLCropOverlayPreviewBottomBar%@", tmpView4.subviews);

                               //重拍按钮

                                if ( [[[tmpView4 class]description]isEqualToString:@"UIButton"]) {

                                    UIButton *recameraButton = (UIButton *)tmpView4;

                                    @weakify(self);

                                    [[recameraButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {

                                        @strongify(self);

                                            self.horizontalScreenPromptsView.hidden = NO;

                                            self.promptslabel.text =@"请将手机横置拍摄";

                                    }];

                                    break;

                                }

                            }

                            break;

                        }

                    }

                }

            }];

    }

    结束

  • 相关阅读:
    子字符串substring 问题
    [Coding Practice] Maximum number of zeros in NxN matrix
    挖一挖unsigned int和补码
    1. 概览
    1. 概览
    Linux sudo 命令的应用
    将秒转化为时分秒
    PHP 信号管理
    HTTP Cache
    Linux 文件压缩与归档
  • 原文地址:https://www.cnblogs.com/pengjuwang/p/8875672.html
Copyright © 2011-2022 走看看