我正在为波形制作修剪编辑器,并且运动滞后,但有时只是。
首先,我将运行该应用程序,它完美无缺。这就是我想要发生的事:https://www.youtube.com/watch?v=_JaJBMR07Vw
然后我再次运行它,而不更改任何代码,并且运动滞后。以下是视频:https://www.youtube.com/watch?v=9fZTV877hSA
有时它有效,有时它不会。
有关其工作原理的简要概述:我有一个用户可以放大或平移的波形。波形被分成样本,所以首先我在修剪编辑器的sx坐标下面找到样本,然后当样本因缩放或平移而改变时,我向后工作,找出修剪编辑器应该在哪些样本下,我将修剪编辑器及其组件移动到新的相应样本。
以下是我初始化的方法
@property (strong, nonatomic) UIView *editor;
@property (nonatomic, strong) UIPanGestureRecognizer *panGesture;
@property (nonatomic, assign) CGFloat leftHandleSamples;
@property (nonatomic, assign) CGFloat rightHandleSamples;
@property CGFloat leftXDimension;
@property CGFloat rightXDimension;
然后我合成了那些。
然后我在viewDidLoad中添加了这个gestureRecognizer:
self.waveformPanRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleWaveformPanGesture:)];
self.waveformPanRecognizer.delegate = self;
[self.waveform addGestureRecognizer:self.waveformPanRecognizer];
然后这个
-(IBAction)edit:(id)sender {
if (player.duration) {
editor = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.waveform.frame.size.width/2, 22)];
[editor setCenter: CGPointMake(self.waveform.center.x, self.waveform.center.y)];
editor.backgroundColor = [UIColor grayColor];
editor.alpha = .75;
[self.view addSubview:editor];
leftHandleSamples = self.waveform.zoomStartSamples + (self.waveform.zoomEndSamples-self.waveform.zoomStartSamples) * (leftHandle.frame.origin.x) / self.waveform.bounds.size.width;
rightHandleSamples = self.waveform.zoomStartSamples + (self.waveform.zoomEndSamples-self.waveform.zoomStartSamples) * (rightHandle.frame.origin.x +rightHandle.frame.size.width) / self.waveform.bounds.size.width;
}
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return YES;
}
- (IBAction)handleWaveformPanGesture:(UIPanGestureRecognizer *)recognizer {
leftXDimension = ((leftHandleSamples - self.waveform.zoomStartSamples)/(self.waveform.zoomEndSamples-self.waveform.zoomStartSamples)) *(self.waveform.frame.size.width);
rightXDimension = ((rightHandleSamples - self.waveform.zoomStartSamples)/(self.waveform.zoomEndSamples-self.waveform.zoomStartSamples)) *(self.waveform.frame.size.width);
editor.center = CGPointMake((rightXDimension - leftXDimension)/2 + leftXDimension, editor.center.y);
}
所以会发生这样的事情:
让我们说leftHandlesample 325(实际上是波形的一部分)位于x轴位置20.当用户将波形向左平移时,让我们说leftHandleSample 325则是x轴位置10.
上面的平移手势告诉编辑器随波形一起移动,这样修剪编辑器上的左手柄也应该转到x轴位置10.
所以leftHandleSample没有更新。根据用户移动波形后样本的位置,仅重新计算x值。
但似乎有一个滞后(只有一些时间)而且令人困惑的是。
我该怎么办?感谢。
答案 0 :(得分:1)
所以,你有两个手势识别器,当用户平移时都会触发。其中一个根据用户的手势更新波形的位置。另一个忽略用户的手势,但使用其动作方法根据波形的当前位置更新手柄位置。
您可以在此处获得延迟的原因是您无法控制波形和句柄更新的顺序。如果在每个帧中,波形手势识别器首先触发,然后手柄的识别器运行第二个,则两个视图的最终位置都将正常(如第一个视频中所示)。但是,如果顺序颠倒,则手柄将首先根据波形的上一个位置进行更新,然后然后波形将根据手势识别器进行更新。结果是手柄将落后一帧,这给你看到的滞后。
由于没有指定触发这些识别器的顺序,有时候你很幸运,有时你不是。
解决方案是不使用手势识别器来更新手柄。当波形更新时,它应通过调用某个方法,发送通知,使用委托协议,使用KVO等来告诉句柄更新。