UIImageView的运动滞后

时间:2015-01-13 02:55:09

标签: ios objective-c uiimageview uipangesturerecognizer uipinchgesturerecognizer

我正在为波形制作修剪编辑器,并且运动滞后,但有时只是。

首先,我将运行该应用程序,它完美无缺。这就是我想要发生的事: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值。

但似乎有一个滞后(只有一些时间)而且令人困惑的是。

我该怎么办?感谢。

1 个答案:

答案 0 :(得分:1)

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

您可以在此处获得延迟的原因是您无法控制波形和句柄更新的顺序。如果在每个帧中,波形手势识别器首先触发,然后手柄的识别器运行第二个,则两个视图的最终位置都将正常(如第一个视频中所示)。但是,如果顺序颠倒,则手柄将首先根据波形的上一个位置进行更新,然后然后波形将根据手势识别器进行更新。结果是手柄将落后一帧,这给你看到的滞后。

由于没有指定触发这些识别器的顺序,有时候你很幸运,有时你不是。

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