UIViewanimation跳转开始

我正在运行这个代码…

[UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{ CGAffineTransform settingsTransform = CGAffineTransformMakeTranslation(self.settingsView.frame.size.width, 0); CGAffineTransform speedTransform = CGAffineTransformMakeTranslation(-self.speedView.frame.size.width, 0); self.settingsView.transform = settingsTransform; self.speedView.transform = speedTransform; } completion:nil]; 

但是当它运行的时候,视图在相反的方向上跳过一半的变换,然后在正确的方向滑动到一半的位置。

我已经减慢了animation的持续时间到5秒,但最初的跳转是瞬间的,一半是在错误的方向转换。

当我用这个代码animation回来…

 [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{ self.settingsView.transform = CGAffineTransformIdentity; self.speedView.transform = CGAffineTransformIdentity; } completion:nil]; 

它完全一样的东西。

结果是最后的运动是所需变换的一半,因为它首先在错误的方向上跳变了一半。

我真的不知道为什么会发生这种情况?

有任何想法吗。

::编辑::

清除一些可能的歧义。

我并没有试图将这些观点“反弹回”他们所在的位置。 我的animation视图就像屏幕边缘的控制面板。 当用户按下“去”视图,然后滑出。 当用户按下“停止”时,面板滑回到视图中。

至less他们曾经这样做过。 由于启用自动布局(我需要的应用程序的其他部分),我不能只是改变视图的框架,所以我去了变换路线。

通过将视图粘贴到视图控制器和button来运行animation,可以看到这种效果。

谢谢

我有完全相同的问题,所以这是我提出的解决scheme。

  CGAffineTransform transform = CGAffineTransformMake(1, 0, 0, 1, translation.x, translation.y); [UIView animateWithDuration:0.25 animations:^{ _assetImageView.transform = transform; [self.view layoutIfNeeded]; } completion:^(BOOL finished) { }]; 

所以我调用[self.view layoutIfNeeded]; 在有生命的块里面 没有这个,就和你有同样的问题,先跳远距离负翻译,然后从那里animation到正确的位置。 我从视图控制器调用它,所以self是UIViewController的子类。 在你的情况下,“self.view”可能不存在,但我希望你明白了。

这里没有解决scheme为我工作…我的animation总是跳过。 (除了在另一个animation的末尾提示时,提示)。

一些细节:

这样做的观点有一系列的规模和翻译已经在堆栈中。

解:

做一个关键帧animation,用一个超短的第一个键,基本上重新应用最后一个animation应该设置的变换。

  UIView.animateKeyframesWithDuration(0.4, delay: 0.0, options: [.CalculationModeCubic], animations: { () -> Void in //reset start point UIView.addKeyframeWithRelativeStartTime(0.0, relativeDuration: 0.01, animations: { () -> Void in self.element.transform = initialTransform }) UIView.addKeyframeWithRelativeStartTime(0.01, relativeDuration: 0.99, animations: { () -> Void in self.element.transform = finalTransform }) }, completion: nil) 

好的,再次观看了WWDCvideo,他们声明使用AutoLayout时必须要做的第一件事就是删除对setFrame的调用。

由于屏幕的复杂性,我已经完全移除了自动布局,现在我正在使用边框位置来移动屏幕周围的视图。

谢谢

我已经问过苹果技术支持关于这个问题,并得到了这个答复,所以这是一个错误。

iOS 8目前正在展示UIKitanimation中的一个已知错误,其中转换animation从错误值(主要影响animation对象的位置,使其看起来在animation开始时意外“跳跃”)变得错误。

[…]

直到提供潜在修补程序的解决方法是下拉到Core Animation API以编写animation。

您的settingsView或speedView在animation发生之前是否已经应用了一个转换?

如果这些视图的转换不是身份转换(又名CGAffineTransformIdentity,又名转换),则无法访问其.frame属性。

UIViews的框架属性在对它们进行转换时是无效的。 使用“界限”来代替。

既然你想让你的第二个animation从你的第一个animation的当前状态(无论是否完成)发生,我build议在设置你的第二个animation时使用UIViewAnimationOptionLayoutSubviews选项。

 [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseOut|UIViewAnimationOptionLayoutSubviews animations:^{ self.settingsView.transform = CGAffineTransformIdentity; self.speedView.transform = CGAffineTransformIdentity; } completion:nil]; 

以下是我使用简单视图控制器模板进行testing的代码示例:

myviewcontroller.m:

 - (void)viewDidLoad { [super viewDidLoad]; self.animatedView = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 160, 80)]; self.animatedView.backgroundColor = [UIColor yellowColor]; [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseOut|UIViewAnimationOptionLayoutSubviews animations:^{ CGAffineTransform settingsTransform = CGAffineTransformMakeTranslation(self.animatedView.frame.size.width, 0); self.animatedView.transform = settingsTransform; } completion:nil]; self.buttonToTest = [UIButton buttonWithType:UIButtonTypeRoundedRect]; self.buttonToTest.frame = CGRectMake(90, 20, 80, 40); [self.buttonToTest setTitle:@"Click Me!" forState:UIControlStateNormal]; [self.buttonToTest addTarget:self action:@selector(buttonClicked) forControlEvents:UIControlEventTouchUpInside]; // set-up view hierarchy [self.view addSubview:self.buttonToTest]; [self.view addSubview: self.animatedView]; } - (void) buttonClicked { [UIView animateWithDuration:.2 delay:0.0 options:UIViewAnimationOptionCurveEaseOut|UIViewAnimationOptionBeginFromCurrentState|UIViewAnimationOptionLayoutSubviews animations:^{ self.animatedView.transform = CGAffineTransformIdentity; } completion:nil]; } 

我有这个问题,解决了它:

  1. 反对原始视图
  2. 添加一个临时视图,复制你想要animation的视图
  3. 执行现在将如预期的animation
  4. 删除临时视图,并以最终状态取消隐藏原始视图

希望这可以帮助。

这是Andreas答案的改进版本关键区别在于,您只能指定一个关键帧并获取较less的代码

 UIView.animateKeyframes(withDuration: animationDuration, delay: 0.0, options: [], animations: { UIView.addKeyframe(withRelativeStartTime: 0.0, relativeDuration: 1.0, animations: { animatedView.transform = newTransform }) }, completion: nil)