更新:儘管我仍然想解決這個問題,我最終切換到animateWithDuration:delay:options:animations:completion:
,它的工作更好。它缺少彈簧所提供的那種「反彈」,但至少它是可控的。UIView動畫與UIPanGestureRecognizer速度方式太快(不減速)
我想創建iOS版漂亮的手勢驅動的用戶界面,但我遇到了一些困難,得到的值,以產生一個很好的自然的感覺應用程序。
我使用animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:
,因爲我喜歡彈簧彈簧動畫。我正在使用手勢識別器在完成狀態下給出的速度初始化參數velocity
。問題在於,如果我足夠快地移動並放手,速度就會達到數千,而我的觀點最終會從屏幕飛出,然後以令人頭暈目眩的復仇來回跳動。
我甚至會根據視圖需要移動的距離來調整動畫的持續時間,這樣如果只需要幾個像素,動畫將花費更少的時間。但是,這並沒有解決問題。它仍然結束了堅果。
我想什麼發生的是認爲應該在任何速度的用戶在拖動開始了,但在到達目標點時,應迅速減速,僅反彈在最後一點點(因爲它如果速度合理)。
我不知道我是否正確使用這種方法或值。這裏有一些代碼來展示我在做什麼。任何幫助,將不勝感激!
- (void)handlePanGesture:(UIPanGestureRecognizer*)gesture {
CGPoint offset = [gesture translationInView:self.view];
CGPoint velocity = [gesture velocityInView:self.view];
NSLog(@"pan gesture state: %d, offset: %f velocity: %f", gesture.state, offset.x, velocity.x);
static CGFloat initialX = 0;
switch (gesture.state) {
case UIGestureRecognizerStateBegan: {
initialX = self.blurView.x;
break; }
case UIGestureRecognizerStateChanged: {
self.blurView.x = initialX + offset.x;
break; }
default:
case UIGestureRecognizerStateCancelled:
case UIGestureRecognizerStateEnded: {
if (velocity.x > 0)
[self openMenuWithVelocity:velocity.x];
else
[self closeMenuWithVelocity:velocity.x];
break; }
}
}
- (void)openMenuWithVelocity:(CGFloat)velocity {
if (velocity < 0)
velocity = 1.5f;
CGFloat distance = -40 - self.blurView.x;
CGFloat distanceRatio = distance/260;
NSLog(@"distance: %f ratio: %f", distance, distanceRatio);
[UIView animateWithDuration:(0.9f * distanceRatio) delay:0 usingSpringWithDamping:0.7 initialSpringVelocity:velocity options:UIViewAnimationOptionBeginFromCurrentState animations:^{
self.blurView.x = -40;
} completion:^(BOOL finished) {
self.isMenuOpen = YES;
}];
}
嘿,你有沒有想過如何正確使用初始彈簧速度? – bogardon
不!結束與一幀呃逆航運... – Arclite