2016-09-06 4 views
1

Это код, связанный с панорамированием/скручиванием видео. Текущая проблема возникает, когда второй этап имеет дельта от последней позиции первого прокрутки. Другими словами, этот код должен учитывать текущее время видео для предотвращения пропусков.Учет текущего времени при панорамировании для очистки видео

`` `

func didSwipe(panGR: UIPanGestureRecognizer) { 

    let translation = panGR.translationInView(self.view) 
    var horizontalTranslation = Float(translation.x) 

    let durationInSeconds = Float(CMTimeGetSeconds(self.playerView.player.player.currentItem!.asset.duration)) 

    // Using 275 as the limit for delta along x 
    let translationLimit: Float = 275 
    let minTranslation: Float = -1 * translationLimit 
    let maxTranslation: Float = translationLimit 

    if horizontalTranslation > maxTranslation { 
     horizontalTranslation = maxTranslation 
    } 

    if horizontalTranslation < minTranslation { 
     horizontalTranslation = minTranslation 
    } 


    let timeToSeekTo = normalize(horizontalTranslation , minDelta: minTranslation, maxDelta: maxTranslation, minDuration: 0, maxDuration: durationInSeconds) 
    print("horizontal translation \(horizontalTranslation) \n timeToSeekTo: \(timeToSeekTo)") 

    self.playerView.player.startScrubbing() 
    self.playerView.player.scrub(timeToSeekTo) 
    self.playerView.player.stopScrubbing() 
} 

func normalize(delta: Float, minDelta: Float, maxDelta: Float, minDuration: Float, maxDuration: Float) -> Float { 

    let result = ((delta - minDelta) * (maxDuration - minDuration)/(maxDelta - minDelta) + minDuration) 
    return result 
} 

` ``

я устанавливаю время начала быть ровно в половину длины видео. Это дает хороший первый результат салфетки в любом направлении. Он имеет заметный пропустить второй и последующий щелчки, потому что он не учитывает текущее время видео (я думаю).

+0

FYI функция нормализации была взята из ответа Джеймса Буша здесь http://stackoverflow.com/questions/26046946/pan-to-seek-avplayer/38770643?noredirect1_comment65610546_38770643 –

+0

У меня такая же проблема, как и вы были здесь и разместили вопрос о SO: http://stackoverflow.com/questions/40363371/pan-gesture-with-avplayer. Не могли бы вы опубликовать код здесь или в моем вопросе с решением этого? Это было бы очень полезно! Спасибо за ваше время. – JEL

ответ

2

Вот код, который я написал, что использует функцию Нормализация, и отображает текущую скорость (и значок воспроизведения, который изменяет размер в зависимости от скорости игрока:

- (IBAction)handlePanGesture:(UIPanGestureRecognizer *)sender { 
     if (sender.state == UIGestureRecognizerStateBegan) { 
      [self.rateLabel setHidden:FALSE]; 
      [self animatePlayerControl:@"▷" size:1.0]; 
      [UIView animateWithDuration:0.375 animations:^{ 
       (self.playerControlsLabel).alpha = 0.5f; 
      }]; 
     } else if (sender.state == UIGestureRecognizerStateEnded) { 
      [self.rateLabel setHidden:FALSE]; // set to TRUE after testing or remove hiding altogether 
      //[self.delegate setRate:oldRate]; 
      //[self animatePlayerControl:@"□" size:1.0]; 
      //[_ChromaEpsilonGammaAppDelegate.playerViewController setRate:0.0]; 
      //[_ChromaEpsilonGammaAppDelegate.playerViewController stop]; 
      [UIView animateWithDuration:0.375 animations:^{ 
       (self.playerControlsLabel).alpha = 0.0f; 
      }]; 
     } else if (sender.state == UIGestureRecognizerStateChanged){ 
      CGPoint location = [sender locationInView:self]; 
      float nlx = ((location.x/((CGRectGetMidX(self.frame)/(self.frame.size.width/2.0))))/(self.frame.size.width/2.0)) - 1.0; 
      //float nly = ((location.y/((CGRectGetMidY(self.view.frame)/(self.view.frame.size.width/2.0))))/(self.view.frame.size.width/2.0)) - 1.0; 
      nlx = nlx * 2.0; 
      [self.delegate setRate:nlx]; 
      if (nlx > 0.0) [self animatePlayerControl:@"▷" size:nlx]; 
      else if (nlx < 0.0) [self animatePlayerControl:@"◁" size:fabs(nlx)]; 
      (self.rateLabel).text = [NSString stringWithFormat:@"%.2f", [self.delegate rate]]; 
     } 
} 

The установки этикетки, которые могут идти в любом месте, не только в методе DrawRect:

- (void)drawRect:(CGRect)rect { 
    (self.brightnessLabel).textColor = [UIColor colorWithWhite:1.0 alpha:1.0]; 
    (self.brightnessLabel).font = [UIFont preferredFontForTextStyle:@"Apple Symbol"]; 
    (self.brightnessLabel).textAlignment = NSTextAlignmentCenter; 
    (self.contrastLabel).textColor = [UIColor colorWithWhite:1.0 alpha:1.0]; 
    (self.contrastLabel).font = [UIFont preferredFontForTextStyle:@"Apple Symbol"]; 
    (self.contrastLabel).textAlignment = NSTextAlignmentCenter; 
    _attrsDictionary = @{NSFontAttributeName: [UIFont systemFontOfSize:24.0 weight:UIFontWeightLight]}; 
} 

И, авто-настройки игрока размера значок кода:

- (void)animatePlayerControl:(NSString *)labelText size:(float)size { 
    (self.playerControlsLabel).textColor = [UIColor colorWithWhite:1.0 alpha:1.0]; 
    (self.playerControlsLabel).font = [UIFont preferredFontForTextStyle:@"Apple Symbol"]; 
    (self.playerControlsLabel).textAlignment = NSTextAlignmentCenter; 
    NSDictionary *attrsDictionary = @{NSFontAttributeName: [UIFont systemFontOfSize:fabs(48.0 * size) weight:UIFontWeightUltraLight]}; 
    NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:labelText attributes:attrsDictionary]; 
    (self.playerControlsLabel).attributedText = attrString; 
} 

Значок игрока - это просто символ из шрифта Apple Symbol.

+0

У меня возникли проблемы с реализацией этого. Не могли бы вы проверить мой вопрос здесь: http://stackoverflow.com/questions/40363371/pan-gesture-with-avplayer – JEL

+0

@JEL Позвоните мне, когда вы будете готовы пройти через него; это не сложно. Кроме того, я могу отправить вам один файл класса, который вы можете добавить в свой проект, и подключиться в качестве делегата через его протокол. Я могу опубликовать этот файл здесь, на самом деле ... –

+0

Большое спасибо за ответ! Мы можем пройти через это сейчас. Как мы это сделаем - через чат StackOverflow? – JEL