gpt4 book ai didi

ios - UIImageView 的移动滞后

转载 作者:行者123 更新时间:2023-11-29 02:22:56 26 4
gpt4 key购买 nike

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

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

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

有时有效,有时无效。

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

这是我的初始化方式

@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。当用户将波形向左平移时,假设 leftHandlesSample 325 然后位于 x 轴位置 10。

上面的平移手势告诉编辑器与波形一起移动,以便修剪编辑器上的左 handle 也应该转到 x 轴位置 10。

所以 leftHandleSample 不会更新。用户移动波形后,只会根据样本所在的位置重新计算 x 值。

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

我应该做什么?谢谢。

最佳答案

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

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

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

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

关于ios - UIImageView 的移动滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27914246/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com