UIImageView 的移动滞后

The movement of UIImageView lags

我正在为波形制作 trim 编辑器,移动滞后,但只是有时。

首先,我将 运行 该应用程序,它运行良好。这就是我想要发生的事情:https://www.youtube.com/watch?v=_JaJBMR07Vw

然后我会再次 运行 它,不更改任何代码,并且移动滞后。这是相关视频:https://www.youtube.com/watch?v=9fZTV877hSA

有时有效,有时无效。

简要概述其工作原理:我有一个用户可以放大或平移的波形。波形被分成样本,所以首先我在 trim 编辑器的 x 坐标下找到样本,然后当样本因缩放或平移而改变时,我向后工作,找出 trim 编辑器应该在下面,我将 trim 编辑器及其组件移动到新的相应示例中。

这是我初始化的方式

@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。

上面的平移手势告诉编辑器与波形一起移动,这样 trim 编辑器上的左手柄也应该转到 x 轴位置 10。

所以 leftHandleSample 没有更新。仅根据用户移动波形后样本所在的位置重新计算 x 值。

但似乎存在滞后(仅在某些时候),这就是令人费解的地方。

我应该做什么?谢谢。

所以,您有两个手势识别器,它们都在用户平移时触发。其中之一根据用户的手势更新波形的位置。另一个忽略用户的手势,但使用其操作方法根据波形的当前位置更新手柄位置。

您在这里可能会滞后的原因是您没有控制波形和句柄的更新顺序。如果在每一帧中,波形手势识别器首先触发,然后手柄的识别器第二个运行,那么两个视图的最终位置都会很好(就像在你的第一个视频中一样)。但是,如果顺序颠倒,手柄将首先根据波形的前一个位置更新,然后然后波形将根据在手势识别器上。结果是手柄将落后一帧,这会产生您看到的延迟。

由于未指定触发这些识别器的顺序,有时您很幸运,有时则不是。

解决方案是不使用手势识别器来更新您的句柄。当波形更新时,它应该通过调用它的一些方法、发送通知、使用委托协议、使用 KVO 等来告诉句柄更新。