在iOS中,如何在另一个视图中使用动量滑动视图?
我知道如何识别一个滑动手势,但我不知道如何使它使其上的视图以动量向左或向右滑动。我所说的“动量”是指在手势结束后,它会持续滑动一段时间,并逐渐停止。我可以用平移动作移动视图,但是视图很长,我需要比平移动作移动得更远更快。视图是否必须位于在iOS中,如何在另一个视图中使用动量滑动视图?,ios,ios7,uiview,gesture,Ios,Ios7,Uiview,Gesture,我知道如何识别一个滑动手势,但我不知道如何使它使其上的视图以动量向左或向右滑动。我所说的“动量”是指在手势结束后,它会持续滑动一段时间,并逐渐停止。我可以用平移动作移动视图,但是视图很长,我需要比平移动作移动得更远更快。视图是否必须位于UIScrollView中?平移动作不在滚动视图中运行 编辑:一些评论问我想做什么。我正在开发一个应用程序,它通过蓝牙低能量从传感器接收心率数据,并以各种方式显示。所以我在屏幕上有几个小的UIView,每个都包含一个数据图。绘图仅使用drawRect和transf
UIScrollView
中?平移动作不在滚动视图中运行
编辑:一些评论问我想做什么。我正在开发一个应用程序,它通过蓝牙低能量从传感器接收心率数据,并以各种方式显示。所以我在屏幕上有几个小的UIView,每个都包含一个数据图。绘图仅使用drawRect和transforms进行(到目前为止,将坐标标签正确定位是最困难的部分)。一个UIView有每分钟心跳(bpm)与时间的对比,另一个有bpm值的直方图,我可以添加更多。bpm vs.time(bpm vs.time)图允许以每秒一个值显示两小时的数据,因此宽7200点。我可以让它更宽一些。当每一个新值到达时,它都被放在右端。当绘图增长到填充UIView的整个宽度后,随着每个新值的添加,绘图开始向左移动一个点,因此最新数据始终可见。一些异常在发生时会被标记出来,例如早搏和漏搏,这些标记会留在图上并随图移动。之所以需要滑动和滚动,是因为我希望用户能够向后滑动数据以查看屏幕上显示的值。我还需要能够上下平移(或滑动),以防在我尝试将垂直刻度与实际数据值匹配后,值的范围不适合屏幕。这就是我想要实现的。我将继续尝试滚动视图。我想我没有让它工作,因为我不知道swipeGesture去了哪里,以及如何让它引起滚动。是的,听起来UIScrollView正是你想要的。我不确定你是否真的可以用“动量”禁用滚动,但你会发现它的行为正是你所需要的
与将UIView嵌套在UIScrollView中不同,您可能会发现UIScrollView做了您需要它做的事情,而没有不必要地将其他UIView嵌套在UIScrollView中。我没有评论的名声,但我想问一下您正在经历的具体问题,或者您试图“滚动”呈现什么…?以下是我为用户在另一个视图中向上/向下拖动视图而使用的一些代码,该视图正在视图上使用手势识别器,并且在用户抬起手指后有继续的动力 只需进行必要的更改,使其适应视图的开始/结束位置以及垂直或水平滚动等 它不使用滚动视图。动量是通过UIViewAnimationOptionCurveEaseOut实现的,你可以尝试其他动画曲线,看看你喜欢哪一条,但这条曲线就像你在帖子中描述的那样“在手势结束后保持滑动一段时间并逐渐停止”
-(iAction)handleVerticalSwipe:(id)发送方
{
如果([sender state]==UIgestureRecognitizerStateStart)
{
self.pulldownViewStartPosition=self.pulldownView.frame.origin.y;
}
其他的
{
int maxYPosition=527;//在运行时计算
CGRect targetFrame=self.pulldownView.frame;
cgloat-newYPos=0;
如果([sender state]==UIgestureRecognitizerStateChanged)
{
//TranslationView:返回一个CGPoint,该CGPoint不是触摸的位置,而是表示触摸的数量
//随时间推移的总翻译量。
//x和y值报告一段时间内的总平移。它们不是上次平移的增量值
//已报告转换。因此,转换值应应用于
//该手势首先被识别,不应在每次调用处理程序时连接到该值。
CGPoint translation=[sender translationView:[self.view superview]];
newYPos=self.pulldownViewStartPosition+translation.y;
if(newYPos>maxYPosition)
{
newYPos=最大位置;
}
if(newYPos
这似乎是滚动视图的理想情况。你有什么理由不想用它吗?是的。让我们知道您似乎不喜欢的UIScrollView
,它正是您想要和需要的
- (IBAction)handleVerticalSwipe:(id)sender
{
if ([sender state] == UIGestureRecognizerStateBegan)
{
self.pulldownViewStartPosition = self.pulldownView.frame.origin.y;
}
else
{
int maxYPosition = 527; // Calculate at run time
CGRect targetFrame = self.pulldownView.frame;
CGFloat newYPos = 0;
if ([sender state] == UIGestureRecognizerStateChanged)
{
// translationInView: returns a CGPoint which is not the position of the touch but the amount representing
// the total translation over time.
// The x and y values report the total translation over time. They are not delta values from the last time that
// the translation was reported. Therefore the translation value should be applied to the state of the view when
// the gesture is first recognized and should not be concatenated to the value each time the handler is called.
CGPoint translation = [sender translationInView: [self.view superview]];
newYPos = self.pulldownViewStartPosition + translation.y;
if (newYPos > maxYPosition)
{
newYPos = maxYPosition;
}
if (newYPos < self.pullDownDefaultPosition)
{
newYPos = self.pullDownDefaultPosition;
}
targetFrame.origin.y = newYPos;
self.pulldownView.frame = targetFrame;
}
else if ([sender state] == UIGestureRecognizerStateEnded) // User has lifted finger after swipe
{
// Gets the velocity of the gesture so it can be determined if the pulldown
// should extend or retract
CGFloat yVectorVelocity = [sender velocityInView: [self.view superview]].y;
if (yVectorVelocity < 0)
{
newYPos = self.pullDownDefaultPosition;
}
else
{
newYPos = maxYPosition;
}
targetFrame.origin.y = newYPos;
[UIView animateWithDuration:kPulldownDefaultAnimationDuration delay:0
options:UIViewAnimationOptionCurveEaseOut
animations:^{
self.pulldownView.frame = targetFrame;
}
completion:nil];
}
}
}