Take into account the current time when panning to clear the video

This is the code for panning / clearing video. The current problem occurs when the second swipe gesture has a delta from the last position of the first scroll. In other words, this code should take into account the current video time to prevent skipping.

`` ``

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 } 

`` ``

I set the start time to exactly half the length of the video. This gives a good first swipe result in any direction. It has a noticeable skip second and subsequent clicks, because it does not take into account the current time of the video (I think).

+1
source share
1 answer

Here's the code I wrote that uses the normalization function and displays the current speed (and a play icon that resizes to fit the player’s speed:

 - (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]]; } } 

Setting up a label that can go anywhere, and not just with the drawRect method:

 - (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]}; } 

And, the player icon auto-tuning code:

 - (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; } 

A player icon is simply a symbol from the Apple Symbol font.

+2
source

Source: https://habr.com/ru/post/1203432/


All Articles