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]; }
我有这个问题,解决了它:
- 反对原始视图
- 添加一个临时视图,复制你想要animation的视图
- 执行现在将如预期的animation
- 删除临时视图,并以最终状态取消隐藏原始视图
希望这可以帮助。
这是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)