Как добавить Pinch Zoom для видео - PullRequest
0 голосов
/ 13 февраля 2019

Я записал видео с помощью AVCapture библиотеки AVFoundation и сохранил в папке с документами.Я могу воспроизводить записанное видео с помощью AVPlayer в моем приложении.Сейчас я пытаюсь реализовать Pinch Zoom.Так что это будет работать так же, как фото приложение работает.Я не хочу использовать scrollview, потому что я хочу записать ZOOMABLE видео.

Для решения этой проблемы у меня есть ВИД.В этом виде я использую AVPlayer.Поэтому, вероятно, мне нужно будет добавить UIPinchGestureRecognizer в представление , после чего я увеличу масштаб для просмотра, а также я изменю значение AVCaptureDevice videoZoomFactor .Я пытался, но иногда мой вид больше зума, а записанное видео имеет меньше зума.Я хочу сделать это так же, как приложение для фотоаппарата.

-(void) handlePinchToZoomRecognizer:(UIPinchGestureRecognizer*)gestureRecognizer {
// NSLog(@"handlePinchToZoomRecognizer called");

if([gestureRecognizer state] == UIGestureRecognizerStateBegan) {
    // Reset the last scale, necessary if there are multiple objects with different scales
    lastScale = [gestureRecognizer scale];
}

/* if ([gestureRecognizer state] == UIGestureRecognizerStateBegan ||
    [gestureRecognizer state] == UIGestureRecognizerStateChanged) {*/
if ([gestureRecognizer state] == UIGestureRecognizerStateChanged) {

    CGFloat currentScale = [[[gestureRecognizer view].layer valueForKeyPath:@"transform.scale"] floatValue];

    // Constants to adjust the max/min values of zoom
    const CGFloat kMaxScale = 2.0;
    const CGFloat kMinScale = 1.0;

    //CGFloat newScale = 1 –  (lastScale – [gestureRecognizer scale]); // new scale is in the range (0-1)
    CGFloat newScale = 1 - (lastScale - [gestureRecognizer scale] );
    newScale = MIN(newScale, kMaxScale / currentScale);
    newScale = MAX(newScale, kMinScale / currentScale);
    CGAffineTransform transform = CGAffineTransformScale([[gestureRecognizer view] transform], newScale, newScale);
    [gestureRecognizer view].transform = transform;

    lastScale = [gestureRecognizer scale];  // Store the previous scale factor for the next pinch gesture call

    NSLog(@"handlePinchToZoomRecognizer %f", lastScale);

    if(lastScale > 0) {
        if (gestureRecognizer.state == UIGestureRecognizerStateChanged) {
            NSError *error = nil;
            if ([self.videoInputDevice lockForConfiguration:&error]) {
                //   CGFloat desiredZoomFactor = self.videoInputDevice.videoZoomFactor + atan2f(gestureRecognizer.velocity, pinchVelocityDividerFactor);
                // Check if desiredZoomFactor fits required range from 1.0 to activeFormat.videoMaxZoomFactor
                /*   self.videoInputDevice.videoZoomFactor = MAX(1.0, MIN(desiredZoomFactor, self.videoInputDevice.activeFormat.videoMaxZoomFactor));*/
                self.videoInputDevice.videoZoomFactor = lastScale;
                [self.videoInputDevice unlockForConfiguration];
            } else {
                NSLog(@"handlePinchToZoomRecognizer error: %@", error);
            }
        }
    }


}

}
...