AVFoundation tap to focus feedback rectangle

后端 未结 5 574
执笔经年
执笔经年 2021-01-30 07:22

I am developing an iphone application where I directly use AVFoundation to capture videos via the camera.

I\'ve implemented a feature to enable the tap to focus

5条回答
  •  陌清茗
    陌清茗 (楼主)
    2021-01-30 07:58

    Here's what I did: This is the class that creates the square that is shown when the user taps on the camera overlay.

    CameraFocusSquare.h
    
    #import 
    @interface CameraFocusSquare : UIView
    @end
    
    
    CameraFocusSquare.m
    
    #import "CameraFocusSquare.h"
    #import 
    
    const float squareLength = 80.0f;
    @implementation FBKCameraFocusSquare
    
    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            // Initialization code
    
            [self setBackgroundColor:[UIColor clearColor]];
            [self.layer setBorderWidth:2.0];
            [self.layer setCornerRadius:4.0];
            [self.layer setBorderColor:[UIColor whiteColor].CGColor];
    
            CABasicAnimation* selectionAnimation = [CABasicAnimation
                                                    animationWithKeyPath:@"borderColor"];
            selectionAnimation.toValue = (id)[UIColor blueColor].CGColor;
            selectionAnimation.repeatCount = 8;
            [self.layer addAnimation:selectionAnimation
                              forKey:@"selectionAnimation"];
    
        }
        return self;
    }
    @end
    

    And in the view where you receive your taps, do the following:

    - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        UITouch *touch = [[event allTouches] anyObject];
        CGPoint touchPoint = [touch locationInView:touch.view];
        [self focus:touchPoint];
    
        if (camFocus)
        {
            [camFocus removeFromSuperview];
        }
        if ([[touch view] isKindOfClass:[FBKVideoRecorderView class]])
        {
            camFocus = [[CameraFocusSquare alloc]initWithFrame:CGRectMake(touchPoint.x-40, touchPoint.y-40, 80, 80)];
            [camFocus setBackgroundColor:[UIColor clearColor]];
            [self addSubview:camFocus];
            [camFocus setNeedsDisplay];
    
            [UIView beginAnimations:nil context:NULL];
            [UIView setAnimationDuration:1.5];
            [camFocus setAlpha:0.0];
            [UIView commitAnimations];
        }
    }
    
    - (void) focus:(CGPoint) aPoint;
    {
        Class captureDeviceClass = NSClassFromString(@"AVCaptureDevice");
        if (captureDeviceClass != nil) {
            AVCaptureDevice *device = [captureDeviceClass defaultDeviceWithMediaType:AVMediaTypeVideo];
            if([device isFocusPointOfInterestSupported] &&
               [device isFocusModeSupported:AVCaptureFocusModeAutoFocus]) {
                CGRect screenRect = [[UIScreen mainScreen] bounds];
                double screenWidth = screenRect.size.width;
                double screenHeight = screenRect.size.height;
                double focus_x = aPoint.x/screenWidth;
                double focus_y = aPoint.y/screenHeight;
                if([device lockForConfiguration:nil]) {
                    [device setFocusPointOfInterest:CGPointMake(focus_x,focus_y)];
                    [device setFocusMode:AVCaptureFocusModeAutoFocus];
                    if ([device isExposureModeSupported:AVCaptureExposureModeAutoExpose]){
                        [device setExposureMode:AVCaptureExposureModeAutoExpose];
                    }
                    [device unlockForConfiguration];
                }
            }
        }
    }
    

提交回复
热议问题