Nei*_*ard 36 uiview uigesturerecognizer uiviewanimation ios uipangesturerecognizer
我希望能够在屏幕上和屏幕外移动子视图,就像在iPhone照片应用程序中构建的图像之间进行浏览一样,所以当我用手指放开时子视图的屏幕超过1/2,它必须屏幕上的动画,但它也必须支持滑动,因此如果滑动/平移速度足够高,它必须在屏幕上显示动画,即使屏幕可能小于1/2.
我的想法是使用UIPanGestureRecognizer,然后测试速度.这是有效的,但是如何基于视图的当前位置和平移速度为UIView的移动设置正确的动画持续时间,使其看起来平滑?如果我设置一个固定值,与我的手指滑动速度相比,动画开始变慢或变快.
Den*_*nis 54
文档说
平移手势的速度,以每秒点数表示.速度分为水平和垂直分量.
所以我想说,鉴于你想要移动你的视图xPoints(用pt测量)让它离开屏幕,你可以像这样计算该运动的持续时间:
CGFloat xPoints = 320.0;
CGFloat velocityX = [panRecognizer velocityInView:aView].x;
NSTimeInterval duration = xPoints / velocityX;
CGPoint offScreenCenter = moveView.center;
offScreenCenter.x += xPoints;
[UIView animateWithDuration:duration animations:^{
moveView.center = offScreenCenter;
}];
Run Code Online (Sandbox Code Playgroud)
你可能想要使用,+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion但尝试不同UIViewAnimationOptions.
Rob*_*Rob 21
依靠速度的观察UIPanGestureRecognizer:我不知道你的经验,但我发现系统在模拟器上产生的速度并不是非常有用.(它在设备上没问题,但在模拟器上有问题.)
如果您快速平移并突然停止,等待,然后才结束手势(例如,用户开始滑动,意识到这不是他们想要的,所以他们停止然后释放他们的手指),速度报告velocityInView:在UIGestureRecognizerStateEnded手指被释放时的状态似乎是我停下来等待之前的快速速度,而本例中的正确速度将为零(或接近零).简而言之,报告的速度是它在平底锅结束之前的速度,而不是平底锅本身末端的速度.
我自己手动计算了速度.(这似乎很愚蠢,这是必要的,但如果我真的想要获得平底锅的最终速度,我没有看到任何方法.)底线,当状态是UIGestureRecognizerStateChanged我跟踪当前和以前的translationInViewCGPoint为以及时间,然后在我UIGestureRecognizerStateEnded用于计算实际最终速度时使用这些值.它工作得很好.
这是我计算速度的代码.我碰巧没有使用速度来计算动画的速度,而是我用它来确定用户是否要足够平移或快速轻弹以使视图移动超过屏幕的一半,从而触发视图之间的动画,但计算最终速度的概念似乎适用于这个问题.这是代码:
- (void)handlePanGesture:(UIPanGestureRecognizer *)gesture
{
static CGPoint lastTranslate; // the last value
static CGPoint prevTranslate; // the value before that one
static NSTimeInterval lastTime;
static NSTimeInterval prevTime;
CGPoint translate = [gesture translationInView:self.view];
if (gesture.state == UIGestureRecognizerStateBegan)
{
lastTime = [NSDate timeIntervalSinceReferenceDate];
lastTranslate = translate;
prevTime = lastTime;
prevTranslate = lastTranslate;
}
else if (gesture.state == UIGestureRecognizerStateChanged)
{
prevTime = lastTime;
prevTranslate = lastTranslate;
lastTime = [NSDate timeIntervalSinceReferenceDate];
lastTranslate = translate;
[self moveSubviewsBy:translate];
}
else if (gesture.state == UIGestureRecognizerStateEnded)
{
CGPoint swipeVelocity = CGPointZero;
NSTimeInterval seconds = [NSDate timeIntervalSinceReferenceDate] - prevTime;
if (seconds)
{
swipeVelocity = CGPointMake((translate.x - prevTranslate.x) / seconds, (translate.y - prevTranslate.y) / seconds);
}
float inertiaSeconds = 1.0; // let's calculate where that flick would take us this far in the future
CGPoint final = CGPointMake(translate.x + swipeVelocity.x * inertiaSeconds, translate.y + swipeVelocity.y * inertiaSeconds);
[self animateSubviewsUsing:final];
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
33555 次 |
| 最近记录: |