我想为位于 UIViewController View 顶部的自定义 View 使用滑动动画。 用户应该能够将自定义 View 向上滑动到顶部以将其发送出屏幕。就像 iOS7 App Switcher 终止应用程序的手势一样:
目前我使用的是附加到我的自定义 View 的 UIPanGestureRecognizer。当自定义 View 被拖动到父 View 的上部 100 像素时,我启动一个 UIAnimation 以将自定义 View 发送到父 View 之外:
- (IBAction)panWasRecognized:(UIPanGestureRecognizer *)recognizer
{
if (recognizer.state == UIGestureRecognizerStateEnded && _myView.center.y >= 100)
{
[self resetViewPosition];
}
else
{
CGPoint translation = [recognizer translationInView:_myView.superview];
CGPoint center = _myView.center;
center.x += translation.x;
center.y += translation.y;
_myView.center = center;
if (center.y < 100)
{
NSLog(@"swipe up gesture detected ...");
[self hideView];
}
[recognizer setTranslation:CGPointZero inView:_myView.superview];
}
}
此方法有效,但不如 iOS7 应用程序切换器那么好。有更好的方法吗?
编辑:
所以这对我有用:
- (IBAction)panWasRecognized:(UIPanGestureRecognizer *)recognizer
{
CGPoint velocity = [recognizer velocityInView:recognizer.view];
if (recognizer.state == UIGestureRecognizerStateEnded && _myView.center.y >= 150)
{
[self resetViewPosition];
}
else
{
CGPoint translation = [recognizer translationInView:_myView.superview];
CGPoint center = _myView.center;
center.x += translation.x;
center.y += translation.y;
_myView.center = center;
if (recognizer.state == UIGestureRecognizerStateEnded && center.y < 150)
{
NSLog(@"swipe up gesture detected ...");
// speed
CGFloat xPoints = -170.0f;
CGFloat velocityX = [recognizer velocityInView:self.view].x;
NSTimeInterval duration = xPoints / velocityX;
[self hideViewWithDuration:duration];
}
}
[recognizer setTranslation:CGPointZero inView:_myView.superview];
}
- (void)hideViewWithDuration:(float)duration
{
NSLog(@"Animation duration: %f", duration);
[UIView animateWithDuration:duration
delay:0.0f
options: UIViewAnimationOptionCurveEaseOut
animations:^
{
CGRect frame = _myView.frame;
frame.origin.y = -170;
frame.origin.x = 10;
_myView.frame = frame;
}
completion:^(BOOL finished)
{
[_myView setHidden:YES];
CGRect frame = _myView.frame;
frame.origin.y = self.view.frame.size.height;
frame.origin.x = 10;
_myView.frame = frame;
[_myView setHidden:NO];
NSLog(@"View is hidden.");
_hideInProgress = NO;
}];
}
- (void)resetViewPosition
{
[UIView animateWithDuration:0.5
delay:0
options: UIViewAnimationOptionCurveEaseOut
animations:^
{
CGRect frame = _myView.frame;
frame.origin.y = (self.view.frame.size.height - _myView.frame.size.height) / 2;
frame.origin.x = 10;
_myView.frame = frame;
}
completion:^(BOOL finished)
{
NSLog(@"View is back to its original place.");
}];
}
最佳答案
这里有几个部分。
- 发布点。它可以是“越过线”,当 View 将被删除时或“低于”,当它返回到起始位置时。
- 释放时的速度。如果速度很高,那么“ View 确实有足够的能量越过线”。
因此,如果点“足够高”或速度“足够高”,我们将删除该 View ,否则将其返回。
第三件事是移除/返回动画。它确实需要有惯性才能表现得更正确。你可以做简单的事情。让“删除窗口”动画的持续时间取决于 1/speed。你走得越快,动画就会越快。
返回动画有点棘手。 window 必须向上一点然后向下。这就是 UIKit Dynamics 可以派上用场的地方。
我为我的项目做了除“返回动画”之外的所有事情,它看起来非常好。
关于ios - 如何制作 iOS 7 应用程序切换器中使用的滑动以终止动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21815091/